Java 最大重复序列而不是最长重复序列
我正在尝试获取字符串中重复次数最多的字符序列。 例如: 输入:Java 最大重复序列而不是最长重复序列,java,string,dynamic-programming,Java,String,Dynamic Programming,我正在尝试获取字符串中重复次数最多的字符序列。 例如: 输入: s = "abccbaabccba" 2 s = "abcabcabcabc" 2 2(abcabc,abcabc) instead of 4(abc,abc,abc,abc) 输出: s = "abccbaabccba" 2 s = "abcabcabcabc" 2 2(abcabc,abcabc) instead of 4(abc,abc,abc,abc) 我使用了动态编程来计算重复序列,但这会返
s = "abccbaabccba"
2
s = "abcabcabcabc"
2
2(abcabc,abcabc) instead of 4(abc,abc,abc,abc)
输出:
s = "abccbaabccba"
2
s = "abcabcabcabc"
2
2(abcabc,abcabc) instead of 4(abc,abc,abc,abc)
我使用了动态编程来计算重复序列,但这会返回最长的重复字符序列。例如:
输入:
s = "abccbaabccba"
2
s = "abcabcabcabc"
2
2(abcabc,abcabc) instead of 4(abc,abc,abc,abc)
输出:
s = "abccbaabccba"
2
s = "abcabcabcabc"
2
2(abcabc,abcabc) instead of 4(abc,abc,abc,abc)
下面是我填充DP表并提取重复序列的代码部分。有人能建议我如何获得最重复的序列吗
//Run through the string and fill the DP table.
char[] chars = s.toCharArray();
for(int i = 1; i <= length; i++){
for(int j = 1; j <= length; j++){
if( chars[i-1] == chars[j-1] && Math.abs(i-j) > table[i-1][j-1]){
table[i][j] = table[i-1][j-1] + 1;
if(table[i][j] > max_length_sub){
max_length_sub = table[i][j];
array_index = Math.min(i, j);
}
}else{
table[i][j] = 0;
}
}
}
//Check if there was a repeating sequence and return the number of times it occurred.
if( max_length_sub > 0 ){
String temp = s;
String subSeq = "";
for(int i = (array_index - max_length_sub); i< max_length_sub; i++){
subSeq = subSeq + s.charAt(i);
}
System.out.println( subSeq );
Pattern pattern = Pattern.compile(subSeq);
Matcher matcher = pattern.matcher(s);
int count = 0;
while (matcher.find())
count++;
// To find left overs - doesn't seem to matter
String[] splits = temp.split(subSeq);
if (splits.length == 0){
return count;
}else{
return 0;
}
}
//遍历字符串并填写DP表。
char[]chars=s.toCharArray();
对于(int i=1;i最大长度){
最大长度=表[i][j];
数组_index=Math.min(i,j);
}
}否则{
表[i][j]=0;
}
}
}
//检查是否存在重复序列,并返回重复序列发生的次数。
如果(最大长度>0){
字符串温度=s;
字符串subSeq=“”;
对于(int i=(数组索引-max\u length\u sub);i
简单且转储,要考虑的最小序列是一对字符(*):
- 循环整个字符串,获取每一个连续的字符对,比如使用
和for
获取字符李>子字符串
- 计算该对在字符串中的出现次数,使用
或正则表达式创建一个方法indexof(String,int)
;及countoccurrencess()
- 存储最大计数,在循环外部使用一个变量
,如果使用maxCount
检查实际计数是否更大(或if
)Math.max()
- 检查第一个字符是否在整个字符串上重复,如果不是
- 检查2个初始字符是否全部重复,如果不是
- 检查3
至少需要2个计数器/循环:一个用于测试字符数,第二个用于测试位置。可以使用一些算法来提高性能:字符串的长度必须可以被不带余数的重复字符数整除 我想这是一项任务。您是否需要使用DP作为解决方案?你允许Java收藏吗?是的!我们不需要使用DP。是的,我可以使用java Collections事实上,我发布了一半的问题。让我提出这个问题。“蛋糕是圆形的,边缘用M&M装饰成一个圆圈。但是蛋糕的其余部分是统一的,M&M不是:有多种颜色,每个仆从都必须得到完全相同的M&M顺序。你还想确保你可以供应整个蛋糕。为了帮助你最好地切蛋糕,你将颜色顺序改为f将蛋糕上的M&M转换成一个字符串:每个可能的字母(a和z之间)对应一种独特的颜色。”“编写一个名为answer(s)的函数,给定长度小于200个字符的描述M&M序列的非空字符串,返回可以从蛋糕上切割而不留下任何剩余部分的最大等分数。”-这是完整的问题陈述。我不知道检查序列对是否能解决此问题@hema begur-不适用于此问题,但应适用于问题中提出的问题-这是您第一次提到“不留下任何剩菜”,这是一个与之前提出的问题完全不同的问题>:-{很抱歉没有发布完整的问题。我使用了与您建议的类似的技术。例如,如果字符串是abcabc,我将尝试查找每个后缀的出现次数(后缀是a、ab、abc、abca、abcab、abcabc)。我使用了(lengthOfSuffix*countOfSuffix==lenOfString)检查是否有剩余。你认为如果我们可以使用DP,那会提供更好的时间复杂度吗?因为这至少是O(n^2)。我使用正则表达式来查找所有后缀的出现次数,我不确定这将花费多少时间,如果查找子字符串匹配需要O(n^2),我上面使用的算法将变成O(n^3)