在包含数字的字符串中查找未知重复模式

我一直在努力解决这个问题。

我有这样的字符串: 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 ….

我需要找到的: 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 = 0 && actualcount == count ) { patern = part2.Substring(part2.IndexOf(part1),part1.Length); } number1--; } return patern; } 

它创建两个字符串副本,并从每次迭代中的一个字符串一次删除1个字符,以找到最小的重复模式。

这是一团糟,根本不能很好地工作。 我怎样才能做到这一点? 提前致谢。

如果您正在寻找简单且不需要最佳复杂性的东西,那么这是一种表示查询的简洁方法。

 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(); } 

请注意,在最坏的情况下,这里的复杂性是二次的,因此将它用于非常长的字符串并不是一个好主意。