我必须实现一个算法来查找String中的所有连续重复。
因此,例如,给定String = a a 1a a 1
生成一种类似此((a )+1)+
的正则表达式。
我试图应用递归算法,但我在网上找不到任何内容。最后,它似乎是一个简单的DFA的实现。
有些帮助吗?感谢。
答案 0 :(得分:1)
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);
}
}
}
关于示例代码的一些注释:
begin
和end
索引适用于substring_1
。substring_2
是等长的子串,连续到substring_1
。substring(int,int)
方法包括起始索引并排除结束索引。因此上面的语义。for
循环不包括字符串中的最后一个索引。这是因为由该索引处的字符组成的非空子字符串没有非空的连续子字符串。for
循环在begin
和字符串结尾之间的中点处停止。这是因为从begin
开始并且比这长的任何子字符串都没有相等长度的连续子字符串。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");
}
}
}
这只是一个你可以完善它的例子。