减少字符串数组中序列的最佳方法

Ed *_*ess 6 .net c# algorithm

现在,我已经重新编写了这个问题,在它遭受更多快速答案或者急切编辑的过早关闭之前,让我指出这不是这个问题的重复.我知道如何从数组中删除重复项.

这个问题是关于从数组中删除序列,而不是严格意义上的重复.

考虑数组中的这个元素序列;

[0] a
[1] a
[2] b
[3] c
[4] c
[5] a
[6] c
[7] d
[8] c
[9] d
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想获得以下内容......

[0] a
[1] b
[2] c
[3] a
[4] c
[5] d
Run Code Online (Sandbox Code Playgroud)

请注意,保留了重复的元素,但同一元素的序列已减少为该元素的单个实例.

此外,请注意,当两行重复时,它们应减少到一组(两行).

[0] c
[1] d
[2] c
[3] d
Run Code Online (Sandbox Code Playgroud)

......减少到......

[0] c
[1] d
Run Code Online (Sandbox Code Playgroud)

我在C#编码,但任何语言的算法都很受欢迎.

sie*_*ben 2

这是我编写的 C# 应用程序,可以解决这个问题。

采用
aabcccdcd

输出
abcacd

可能看起来很混乱,我花了一些时间才了解动态模式长度。

class Program
{
    private static List<string> values;
    private const int MAX_PATTERN_LENGTH = 4;

    static void Main(string[] args)
    {
        values = new List<string>();
        values.AddRange(new string[] { "a", "b", "c", "c", "a", "c", "d", "c", "d" });


        for (int i = MAX_PATTERN_LENGTH; i > 0; i--)
        {
            RemoveDuplicatesOfLength(i);
        }

        foreach (string s in values)
        {
            Console.WriteLine(s);
        }
    }

    private static void RemoveDuplicatesOfLength(int dupeLength)
    {
        for (int i = 0; i < values.Count; i++)
        {
            if (i + dupeLength > values.Count)
                break;

            if (i + dupeLength + dupeLength > values.Count)
                break;

            var patternA = values.GetRange(i, dupeLength);
            var patternB = values.GetRange(i + dupeLength, dupeLength);

            bool isPattern = ComparePatterns(patternA, patternB);

            if (isPattern)
            {
                values.RemoveRange(i, dupeLength);
            }
        }
    }

    private static bool ComparePatterns(List<string> pattern, List<string> candidate)
    {
        for (int i = 0; i < pattern.Count; i++)
        {
            if (pattern[i] != candidate[i])
                return false;
        }

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

修复初始值以匹配问题值