我一直在努力解决这个问题。
我有一个这样的字符串: 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 .....
我需要找到的内容: 1 1 0
示例2: 1 1 2 0 2 2 1 0 1 1 2 0 2 2 1 0 1 1 2 0 2 2 1 0 1 1 2 0 2 2 1 0 .... < / p>
我需要找到的内容: 1 1 2 0 2 2 1 0
示例3: 1 1 2 3 1 0 1 1 2 3 1 0 1 1 2 3 1 0 1 1 2 3 1 0 1 1 2 3 1 0 ...
112310
等。等
我的代码现在:
private string tekrarArama(double[] mods)
{
string part1 = "";
string part2 = "";
string patern = "";
int number1 = mods.Length;
for (int i = 0; i < mods.Length; i++)
{
part1 = "";
part2 = "";
for (int j = 0; j < number1; j++)
{
part1 += mods[j] + ",";
}
for (int k = 0; k < mods.Length; k++)
{
part2 += mods[k] + ",";
}
int actualcount = Regex.Matches(part2, part1).Count;
int count = part2.Replace(",", "").Length / part1.Replace(",", "").Length;
if (part2.IndexOf(bolum1) >= 0 && actualcount == count )
{
patern = part2.Substring(part2.IndexOf(part1),part1.Length);
}
number1--;
}
return patern;
}
它创建了两个字符串副本,并且每次从每个迭代中的一个字符串中删除1个字符,以找到最小的重复模式。
一团糟,根本不能很好地工作。 我怎样才能做到这一点?提前谢谢。
答案 0 :(得分:2)
如果您正在寻找简单且不需要最佳复杂性的东西,这里有一种简洁的方式来表示查询。
string FindPattern(string text)
{
if (text == null)
{
return null;
}
return Enumerable
.Range(1, text.Length / 2)
.Where(n => text.Length % n == 0)
.Select(n => text.Substring(0, n))
.Where(pattern => Enumerable
.Range(0, text.Length / pattern.Length)
.SelectMany(i => pattern)
.SequenceEqual(text))
.FirstOrDefault();
}
请注意,这种复杂性在最坏的情况下是二次的,所以将它用于很长的字符串并不是一个好主意。