Tôi đang cố giải quyết vấn đề gần như chính xác. Cụ thể, tôi được cung cấp một chuỗi s
sao cho s.Length % 4 == 0
và mỗi s[i]
là một trong số 'A'
, 'C'
, 'T'
hoặc 'G'
. Tôi muốn tìm chuỗi con nhỏ nhất mà tôi có thể thay thế sao cho mỗi của 'A'
, 'C'
, 'T'
và 'G'
xuất hiện chính xác s.Length/4
lần.Chuỗi con nhỏ nhất có thể được thay thế để làm cho chuỗi có cùng số của mỗi ký tự
Ví dụ: với s="GAAATAAA"
, một giải pháp tối ưu là thay thế chuỗi con "AAATA"
bằng "TTCCG"
, dẫn đến "GTTCCGAA"
.
Tôi đã giải thích cách tiếp cận của mình trong các nhận xét bên dưới và tôi tự hỏi liệu nó có phải là chính xác hay không trong đó nó sẽ đưa tôi đến câu trả lời đúng.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
class Solution
{
static string ReplacementForSteadiness(string s)
{
var counter = new Dictionary<char,int>() {
{ 'A', 0 }, { 'C', 0 }, { 'G', 0 }, { 'T', 0 }
};
for(int i = 0; i < s.Length; ++i)
counter[s[i]] += 1;
int div = s.Length/4;
var pairs = counter.ToList();
if(pairs.All(p => p.Value == div))
return "";
// If here, that means there is an even count of characters in s. For example, if
// s = "AAATGTTCTTGCGGGG", then counter = { A -> 3, T -> 5, C -> 2, G -> 6 },
// div = 4, and we know that we need to increase the number of As by 1, decrease
// the number of Ts by 1, increase the number of Cs by 2 and decrease the number
// of Gs by 2.
// The smallest strings to replace will have 1 T and 2 Gs, to be replaced with 1 A and
// 2 Cs (The order of characters in the replacement string doesn't matter).
// "TGG" --> "ACC"
// "GTG" --> "ACC"
// "GGT" --> "ACC"
// None of those strings exist in s. The next smallest strings that could be replaced
// would have 1 T and 3Gs, to be replaced with 1 A and 2 of the Gs to be replaced with
// Cs. Or, 2 Ts and 2Gs, 1 of the Ts to be replaced by an A and both the Gs to be replaced
// by Cs.
// "TGGG" --> "AGCC"
// "GTGG" --> "AGCC"
// "GGTG" --> "AGCC"
// "GGGT" --> "AGCC"
// "TTGG" --> "ATCC"
// "TGTG" --> "ATCC"
// "GTGT" --> "ATCC"
// "GGTT" --> "ATCC"
// None of those strings exist in s. Etc.
string r;
// ...
return r;
}
static void Main(String[] args)
{
Console.ReadLine(); // n
string str = Console.ReadLine();
string replacement = ReplacementForSteadiness(str);
Console.WriteLine(replacement.Length);
}
}
Bạn có được phép giả định rằng giải pháp tồn tại không? Ví dụ.chuỗi 'AAB' không thể được chỉnh sửa thành một chuỗi chứa cùng một số 'A' và 'B' - bạn có chắc chắn rằng các trường hợp như thế này sẽ không xảy ra? –
@j_random_hacker: chiều dài phải chia hết cho 4, tôi tin rằng điều đó là đủ. Và có vẻ như bạn không phải thay thế tất cả các chữ cái trong chuỗi con này (từ nhận xét này: '" GGTG "->" AGCC "', trong đó 'G' ở chỉ mục thứ 2 không thay đổi). – Groo
Rất tiếc, phương pháp này sẽ mất ít nhất thời gian trong trường hợp xấu nhất, vì chuỗi con bạn cần có chiều dài O (n) (ví dụ: nếu ví dụ của bạn thay đổi sao cho tất cả 'T' ở phía trước, và tất cả 'G' ở cuối, do đó, O (n) 'C' và 'A' xuất hiện giữa bất kỳ 'T' và' G'), và (có vẻ như) bạn đang tạo ra và kiểm tra tất cả các giá trị hợp lệ trong tăng thứ tự chiều dài. –