【问题标题】:Finding unknown repeating patterns in a string consisting numbers在包含数字的字符串中查找未知的重复模式
【发布时间】:2014-04-10 18:21:27
【问题描述】:

我已经为此苦苦挣扎了一个星期。

我有一个这样的字符串: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 < 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 个字符,以找到最小的重复模式。

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

【问题讨论】:

  • @PatrykĆwiek 我不认为他在寻找最长的。在给出的第一个示例中,110 不是最长的重复子字符串。
  • 先将算法描述为伪代码并用铅笔和纸进行桌面运行可能会更好。
  • @PatrykĆwiek 更像是最短的字符串:)

标签: c# string pattern-matching repeat


【解决方案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();
}

请注意,这里的复杂度在最坏的情况下是二次方的,因此对于很长的字符串使用它不是一个好主意。

【讨论】:

  • 谢谢!这正是我所需要的。
猜你喜欢
  • 2014-03-24
  • 1970-01-01
  • 2019-07-20
  • 2016-01-15
  • 1970-01-01
  • 2015-05-11
  • 2015-01-27
  • 2012-11-07
  • 2016-10-30
相关资源
最近更新 更多