【问题标题】:Finding a repeated pattern in a string在字符串中查找重复的模式
【发布时间】:2014-03-24 13:53:46
【问题描述】:

如何在字符串中找到重复的模式?例如,如果输入文件是

AAAAAAAAA
ABABAB
ABCAB
ABAb

它会输出:

A
AB
ABCAB
ABAb

【问题讨论】:

  • 如果字符串是"AABB"。预期的输出是多少?
  • AABB。重复必须从头到尾一直进行,否则返回整个字符串。
  • @BelgianMyWaffle 我不认为这是重复的。如果我很好地理解了这个问题,那么它是关于字符串中的重复模式,而不是字符。
  • 如果字符串是AABB,那么输出就是AABB

标签: java string character


【解决方案1】:

这会输出您要求的内容 - 正则表达式可能可以改进以避免循环,但我无法修复它...

public static void main(String[] args) {
    List<String> inputs = Arrays.asList("AAAAAAAAA", "ABABAB", "ABCAB", "ABAb");
    for (String s : inputs) System.out.println(findPattern(s));
}

private static String findPattern(String s) {
    String output = s;
    String temp;
    while (true) {
        temp = output.replaceAll("(.+)\\1", "$1");
        if (temp.equals(output)) break;
        output = temp;
    }
    return output;
}

【讨论】:

  • @Bohemian 有人可以单独解释一下正则表达式部分吗? ("(.+)\\1", "$1")
  • @santhoshkumar 请参阅 my answer 了解正则表达式的说明
【解决方案2】:

用 C# 编写,但翻译应该很简单。

public static string FindPattern(string s)
{
    for (int length = 1; length <= s.Length / 2; length++)
    {
        string pattern = s.Substring(0, length);
        if(MatchesPattern(s, pattern))
        {
            return pattern;
        }
    }
    return s;
}

public static bool MatchesPattern(string s, string pattern)
{
    for (int i = 0; i < s.Length; i++)
    {
        if(!s[i].Equals(pattern[i%pattern.Length]))
        {
            return false;
        }
    }
    return true;
}

【讨论】:

    【解决方案3】:

    如果你使用正则表达式,你只需要一行:

    String repeated = str.replaceAll("(.+?)\\1+", "$1");
    

    分解正则表达式(.+?)\1

    • (.+?) 表示“至少一个字符,但尽可能少,作为第 1 组捕获”
    • \1 表示“与第 1 组相同的字符

    这是一些测试代码:

    String[] strs = {"AAAAAAAAA", "ABABAB", "ABCAB", "ABAb"};
    for (String str : strs) {
        String repeated = str.replaceAll("(.+?)\\1+", "$1");
        System.out.println(repeated);
    }
    

    输出:

    A
    AB
    ABCAB
    ABAb
    

    【讨论】:

    • @santhoshkumar 取决于您所说的“作品”是什么意思。你对AAAAAAB 有什么期望?
    • 糟糕..,抱歉不清楚。例如..,“AAAAAAB”我需要输出为“AAAAAAB”,但这是返回“AB”。我该如何调整这个?
    【解决方案4】:

    如果重复段之间可能有空格:

    (.+?)(\\ ?\\1)+
    

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 2015-05-11
      • 2015-01-27
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2020-09-06
      • 2022-01-07
      相关资源
      最近更新 更多