我想开发一个方法,它将返回由相同字符组成的最大子字符串的长度,形成作为参数传递的字符串,但不使用任何.NET libraries
。
例如,如果我们将aaacccccdefffgg
作为参数传递,则最大子字符串为ccccc
,方法应返回5.
这是我的工作解决方案:
public static int GetMaxSubstringLenght(char[] myArray)
{
int max = 0;
for (int i = 0; i < myArray.Length-1; i++)
{
if (myArray.Length == 0)
{
return 0;
}
else
{
int j = i + 1;
int currentMax = 1; // string has some value, so we start with 1
while (myArray[i] == myArray[j])
{
currentMax++;
if (max < currentMax)
{
max = currentMax;
}
j++;
}
}
}
return max;
}
上面的代码将返回预期的结果,但我想避免在for loop
中进行一些不必要的迭代。在i=0
的第一次迭代中,它将比较j=2
,然后将离开while loop
并在for loop
中开始第二次迭代,比较[1]
索引处的第二次迭代使用[2]
,我们在之前的迭代中已经做过。基本上,当第一次迭代完成时,下一个应该从j
的最后一个值开始。我怎样才能做到这一点?
提前谢谢你。
答案 0 :(得分:6)
由于您需要“最大子字符串...”,我们将String
作为参数并返回String
public static String GetMaxSubstring(String value) {
if (String.IsNullOrEmpty(value))
return "";
int bestCount = 0;
char bestChar = '\0';
int currentCount = 0;
char current = '\0';
for (int i = 0; i < value.Length; ++i) {
if ((i == 0) || (value[i] != current))
currentCount = 0;
currentCount += 1;
current = value[i];
if (currentCount > bestCount) {
bestCount = currentCount;
bestChar = current;
}
}
return new String(bestChar, bestCount);
}
...
// "ccccc"
String result = GetMaxSubstring("aaacccccdefffgg");
// 5
int length = result.Length;
答案 1 :(得分:4)
另一种方法:
public static int MaxSubstringLength(string s)
{
if (string.IsNullOrEmpty(s))
return 0;
int max = 0, cur = 1;
for (int i = 1; i < s.Length; ++i, ++cur)
{
if (s[i] != s[i-1])
{
max = cur > max ? cur : max;
cur = 0;
}
}
return cur > max ? cur : max;
}
[编辑]简化了代码。 [EDIT2]进一步简化了代码。
答案 2 :(得分:1)
你也可以用一个循环来做到这一点:
public static int GetMaxSubstringLenght(char[] myArray)
{
int max = 0;
char currentchar = myArray[0];
int count = 1;
for each(char c in myArray)
{
if(currentchar != c)
{
count = 1;
currentchar = c;
}
if(count > max)
{
max = count;
}
count++;
}
return max;
}
我更改了代码...现在这段代码不使用math.max而且我认为我已经解决了这个错误......我现在还没有IDE来测试它
答案 3 :(得分:1)
static int LongestCharSequence(string s)
{
if (string.IsNullOrEmpty(s)) return 0;
var prevChar = '\0';
int cmax = 0;
int max = 1;
foreach (char c in s)
{
if (c != prevChar)
{
cmax = 1;
prevChar = c;
}
else
{
if (++cmax > max) max = cmax;
}
}
return max;
}
答案 4 :(得分:1)
public static int GetMaxSubstringLenght(char[] myArray)
{
if (myArray.Length == 0)
return 0;
if (myArray.Length == 1)
return 1;
int max = 1;
int localMax = 1;
for (int i = 0; i < myArray.Length - max; i++ )
{
if (myArray[i] == myArray[i + 1])
{
localMax++;
}
else
{
max = Math.Max(max, localMax);
localMax = 1;
}
}
return Math.Max(max, localMax);
}
答案 5 :(得分:1)
递归!
static int LongestCharSequence(string s)
{
int i = (s?.Length ?? 0) == 0 ? 0 : 1;
for (; i < s?.Length; i++)
if (s[i] != s[i - 1]) return Math.Max(i, LongestCharSequence(s.Substring(i)));
return i;
}
答案 6 :(得分:1)
使用我最喜欢的嵌套循环技术的另一种解决方案:
public static int MaxSubstringLength(string s)
{
int maxLength = 0;
for (int length = s != null ? s.Length : 0, pos = 0; pos < length;)
{
int start = pos;
while (++pos < length && s[pos] == s[start]) { }
maxLength = Math.Max(maxLength, pos - start);
}
return maxLength;
}