在String java中查找所有连续重复

时间:2016-12-02 18:28:26

标签: java string dfa

我必须实现一个算法来查找String中的所有连续重复。

因此,例如,给定String = a a 1a a 1生成一种类似此((a )+1)+的正则表达式。

我试图应用递归算法,但我在网上找不到任何内容。最后,它似乎是一个简单的DFA的实现。

有些帮助吗?感谢。

2 个答案:

答案 0 :(得分:1)

解决方案

psueocode:

for every combination of two adjacent substrings of equal length
    if the two adjacent substrings are equal
        add the substring to a set of consecutive repetitions

解释

set非常重要,以避免添加任何特定连续重复的多个实例。但是,如果这是你想要做的,那么你理论上可以使用任何数据结构。 (但multiset可能是最好的...请参阅Google Guava' multiset

请注意,for循环遍历每个组合,而不是排列。这是因为你的问题陈述暗示订单无关紧要(这是真的吗?)。

实际上,迭代两个相等长度的相邻子串的每个组合的最简单方法是使用两个嵌套循环。这一步也可以进行优化(例如可能带有记忆)。

示例代码

for (int begin = 0; begin < string.length() - 1; ++begin) {
    for (int end = begin; end < (string.length() + begin) / 2; ++end) {

        substring_1 = string.substring(begin, end+1);
        substring_2 = string.substring(end+1, end+1 + substring_1.length());

        if (substring_1.equals(substring_2)) {
            set.add(substring_1);
        }
    }
}

关于示例代码的一些注释:

  • beginend索引适用于substring_1
  • substring_2是等长的子串,连续到substring_1
  • substring(int,int)方法包括起始索引并排除结束索引。因此上面的语义。
  • &#34;开始&#34; for循环不包括字符串中的最后一个索引。这是因为由该索引处的字符组成的非空子字符串没有非空的连续子字符串。
  • &#34;结束&#34; for循环在begin和字符串结尾之间的中点处停止。这是因为从begin开始并且比这长的任何子字符串都没有相等长度的连续子字符串。

更多优化:

  • 为避免每次迭代生成两个新String对象以表示substring_1和substring_2的开销,请改用regionMatches(int,String,int,int)方法。调用此方法的String以及&#34;其他&#34; String参数将是相同的(原始的,全长的)String。

例如:

for (offset1 = 0; offset1 < string.length() - 1; ++offset1) {
    for (len = 1; len < ((string.length() - offset) / 2) + 1; ++len) {

        offset2 = offset1 + len;

        if (string.regionMatches(offset1, string, offset2, len)) {
            set.add(string.substring(offset1, offset1 + len));
        }
    }
}

答案 1 :(得分:0)

首先将String除以字符​​,然后使用循环检查相似性:

String txt = "text";
char chars[] = txt.toCharArray();
for(int i =0; i < chars.length; i++){
    if(i>0){
        if(chars[i] == chars[i-1]) {
             System.out.println(i + " and" + (i-1) + "are similar");
        }
    }
}

这只是一个你可以完善它的例子。