Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最大重复序列而不是最长重复序列_Java_String_Dynamic Programming - Fatal编程技术网

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()
(*)如果“abc”出现5次,那么“ab”(和“bc”)也会出现至少5次-因此只搜索“ab”和“bc”就足够了,不需要选中“abc”

编辑如果没有剩余内容,请参阅评论,摘要:

  • 检查第一个字符是否在整个字符串上重复,如果不是

  • 检查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)