最大的子串由相同的字符组成

时间:2016-06-08 13:20:50

标签: c# algorithm

我想开发一个方法,它将返回由相同字符组成的最大子字符串的长度,形成作为参数传递的字符串,但不使用任何.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的最后一个值开始。我怎样才能做到这一点?

提前谢谢你。

7 个答案:

答案 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;
}