【问题标题】:Finding duplicate Substrings?查找重复的子字符串?
【发布时间】:2014-09-03 02:57:46
【问题描述】:

是否有一种逻辑方法可以在字符串中找到重复的子字符串,无论子字符串重复多少次都可以使用;然后返回它与最终单词重复的次数。

For example, abc-abc-abc-
Can be broken into | abc- | abc- | abc-
                                 = abc- x3

Example 2, abc-abc-abc-abc-
Can be broken into | abc- | abc- | abc- | abc-
                                        = abc- x4

对于偶数重复,将字符串分成两半然后比较两个子字符串是没有问题的。然后你可以继续循环,直到一半不匹配。

对于奇数字符串长度,您可以将其分成 3 部分并比较所有三个部分并执行相同的操作。

当一个单词重复 7 或 11 次时,就会出现问题。将长度除以 4 或 5 可能会起作用。

例如,带有yesnoyesnoyesnoyesnoyesnoyesnoyesno 的字符串具有重复7 times. 的子字符串yesno

是否有某种公式、正则表达式或 linq 可以将 yesnoyesnoyesnoyesnoyesnoyesnoyesno 转换为 yesno (x7)

【问题讨论】:

  • 你想要最长的重复子串吗? substring 之间可以有其他字符串吗?喜欢 aaaaaabaaaaaa (x2 aaaaaa)?
  • 如果你想要最长的重复子串,那么abc-abc-abc-abc-将被表示为abc-abc- x2
  • @AndrewShepherd 我询问了shortest 子字符串。所以可以进一步分解为abc-
  • @brz 这被认为是一个唯一的字符串。现在如果是aaaaaabaaaaaab,那么它将是aaaaaab 重复x2。

标签: c# regex string substring formula


【解决方案1】:

这对我有用 (..*?)(?=\1(?=\1*$)|$) demo
甚至更短的(..*?)(?=\1*$)demo

  • (..*?) 至少捕获一个字符并根据需要添加任意多个
  • (?=\1*$) 尽可能多地提前查看之前捕获的结果直到结束。

【讨论】:

  • 这看起来很棒并且可以找到相同的单词,但它不会将 yesnoyesnoyesnoyesno1 视为唯一字符串。 yesno1 被视为重复。
  • 优秀的正则表达式。如果您能解释正则表达式的分解,将会对其他人有所帮助。
  • 为什么不用 .+ 而不是 ..*? ?
  • .+ 会吞噬整个字符串,不过你可以使用 .+?
【解决方案2】:
var list=new string[]{"abc-abc-abc-",
                    "abc-abc-abc-abc-",
                    "yesnoyesnoyesnoyesnoyesnoyesnoyesno"};
var reg=new Regex("(.+?)(?=\\1|$)");
foreach(var str in list)
{
  string result=string.Format("{0} (x{1})",reg.Match(str).Value,  reg.Matches(str).Count);
  Console.WriteLine(result);
}

输出:

abc- (x3)
abc- (x4)
yesno (x7)

【讨论】:

  • 这非常接近,但是如果不能完美分解字符串,有没有办法将其计为非重复?如1231231234 算作123 (x3) 但需要保留为唯一字符串。
  • 感谢您的回答。这很有帮助。插入您的代码的 alpha bravo 正则表达式将是完美的答案。
猜你喜欢
  • 1970-01-01
  • 2020-02-24
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多