最长运行C#的索引

Kob*_*_24 7 c# algorithm icomparer

我试图解决这个问题:编写一个函数,找到字符串中最长运行的从零开始的索引.运行是相同字符的连续序列.如果有多个具有相同长度的运行,则返回第一个的索引.

例如,IndexOfLongestRun("abbcccddddcccbba")应该返回6,因为最长的运行是dddd,它首先出现在索引6上.

按照我的所作所为:

private static int IndexOfLongestRun(string str) 
    {
        char[] array1 = str.ToCharArray();
        //Array.Sort(array1);
        Comparer comparer = new Comparer();
        int counter =1;
        int maxCount = 0;
        int idenxOf = 0;

        for (int i =0; i<array1.Length-1 ; i++)
        {
            if (comparer.Compare(array1[i],array1[i+1]) == 0)
            {
                counter++;
            }
            else {
                if(maxCount < counter)
                {
                    maxCount = counter;
                    idenxOf = i - counter + 1;
                }
                counter = 1;
            }
        }
        return idenxOf ;  
    }
}

public class Comparer : IComparer<char>
{
    public int Compare(char firstChar, char nextChar)
    {
        return firstChar.CompareTo(nextChar);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我到达最后一个索引例如"abbccaaaaaaaaaa"时,在这种情况下,当i=14(以此字符串为例)并且当i<array1.Length-1statment为false时,for循环直接跳转到return indexOf;并返回错误的索引,我试图找出如何推动forloop继续实现,以便idenxOf可以更改为正确的索引.有什么帮助吗?

Kva*_*vam 4

您可以检查当前 == 上一个时每次迭代是否获得新的最佳分数。速度稍慢,但它允许您通过省略循环后的额外检查来编写更短的代码:

int IndexOfLongestRun(string input)
{
    int bestIndex = 0, bestScore = 0, currIndex = 0;
    for (var i = 0; i < input.Length; ++i)
    {
        if (input[i] == input[currIndex])
        {
            if (bestScore < i - currIndex) 
            {
                bestIndex = currIndex;
                bestScore = i - currIndex;
            }
        }
        else
        {
            currIndex = i;
        }
    }
    return bestIndex;
}
Run Code Online (Sandbox Code Playgroud)