现在,我已经重新编写了这个问题,在它遭受更多快速答案或者急切编辑的过早关闭之前,让我指出这不是这个问题的重复.我知道如何从数组中删除重复项.
这个问题是关于从数组中删除序列,而不是严格意义上的重复.
考虑数组中的这个元素序列;
[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#编码,但任何语言的算法都很受欢迎.
这是我编写的 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)
修复初始值以匹配问题值
归档时间: |
|
查看次数: |
900 次 |
最近记录: |