Nếu chuỗi ngắn, thì chỉ lặp và thử nghiệm có thể là cách đơn giản và hiệu quả nhất. Ý tôi là bạn có thể tạo bộ băm (trong bất kỳ nền tảng nào bạn đang sử dụng) và lặp qua các ký tự, không thành công nếu ký tự đã có trong bộ và thêm nó vào bộ khác - nhưng đó chỉ có khả năng cung cấp bất kỳ lợi ích nào khi các chuỗi dài hơn.
EDIT: Bây giờ chúng ta đã biết nó được sắp xếp, mquander's answer là IMO tốt nhất. Dưới đây là một thực hiện:
public static bool IsSortedNoRepeats(string text)
{
if (text.Length == 0)
{
return true;
}
char current = text[0];
for (int i=1; i < text.Length; i++)
{
char next = text[i];
if (next <= current)
{
return false;
}
current = next;
}
return true;
}
Một lựa chọn ngắn hơn nếu bạn không nhớ lặp đi lặp lại việc sử dụng indexer:
public static bool IsSortedNoRepeats(string text)
{
for (int i=1; i < text.Length; i++)
{
if (text[i] <= text[i-1])
{
return false;
}
}
return true;
}
EDIT: Được rồi, với "tần số" phụ, tôi sẽ biến các vấn đề vòng một chút. Tôi vẫn sẽ giả định rằng chuỗi được sắp xếp, vì vậy những gì chúng ta muốn biết là độ dài của chuỗi dài nhất. Khi không có lặp lại, độ dài chạy dài nhất sẽ là 0 (cho một chuỗi trống) hoặc 1 (đối với một chuỗi không trống). Nếu không, nó sẽ là 2 hoặc nhiều hơn.
Lần đầu tiên một chuỗi phiên bản cụ thể:
public static int LongestRun(string text)
{
if (text.Length == 0)
{
return 0;
}
char current = text[0];
int currentRun = 1;
int bestRun = 0;
for (int i=1; i < text.Length; i++)
{
if (current != text[i])
{
bestRun = Math.Max(currentRun, bestRun);
currentRun = 0;
current = text[i];
}
currentRun++;
}
// It's possible that the final run is the best one
return Math.Max(currentRun, bestRun);
}
Bây giờ chúng ta cũng có thể làm điều này như một phương pháp khuyến nông chung trên IEnumerable<T>
:
public static int LongestRun(this IEnumerable<T> source)
{
bool first = true;
T current = default(T);
int currentRun = 0;
int bestRun = 0;
foreach (T element in source)
{
if (first || !EqualityComparer<T>.Default(element, current))
{
first = false;
bestRun = Math.Max(currentRun, bestRun);
currentRun = 0;
current = element;
}
}
// It's possible that the final run is the best one
return Math.Max(currentRun, bestRun);
}
Sau đó, bạn có thể gọi "AABCD".LongestRun()
ví dụ.
"ABCDA" có được coi là lặp lại không? I E. bạn có quan tâm đến bất kỳ lặp lại hoặc chỉ là ký tự liên tiếp? – Richard
Phiên bản nào của khung công tác? – BenAlabaster
Phiên bản khung là 3.5 – inspite