在包含数字的字符串中查找未知重复模式
我一直在努力解决这个问题。
我有这样的字符串: 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(); }
请注意,在最坏的情况下,这里的复杂性是二次的,因此将它用于非常长的字符串并不是一个好主意。