KMP算法获得对应匹配值数组的方法遗留问题

找了好几个小时,都推了好几遍,还是没能找出问题出在哪里,求助大佬

KMP算法的获得部分匹配值数组的方法代码
(1). KMP与暴力匹配的作用都是判断某个是字符串是否包含模式字符串,如果包含,则返回模式字符串第一次出现的位置,否则返回-1。
(2). KMP与暴力匹配算法核心不同之处在于,暴力匹配算法当发现不同后,原字符串索引回到这次搜索开始的下一个索引,移动位数为1,而KMP算法移动位数不为1,节省了一些不必要的对比时间。
(3). KMP移动位数 = 已经匹配的字符数 - 对应的匹配值
需要建立一个方法来获得给定字符串的对应匹配值数组,代码如下:

package KMP;

import java.util.ArrayList;
import java.util.Arrays;

public class KMPAlgorithm {
    public static void main(String[] args) {
        String s = "ABCDABD";
        int[] arr = getMatchedValue(s);
        String arrString = Arrays.toString(arr);
        System.out.println(arrString);
    }
    //获取KMP对应匹配值数组的方法
    public static int[] getMatchedValue(String ss){
        int[] arrvalue = new int[ss.length()];
        ArrayList<String> prefixchar = new ArrayList<String>(ss.length()-1);//前缀字符串容器,个数比字符串长度少一个
        ArrayList<String> postfixchar = new ArrayList<String>(ss.length()-1);//后缀字符串容器,个数比字符串长度少一个
        ArrayList<String> samechar = new ArrayList<String>(ss.length()-1);//相同字符串容器,最大个数比字符串长度少一个
        String s = "";
        int max = 0;//相同字符串容器中的长度最大值
        for(int n=1;n<=ss.length();n++){
            s = ss.substring(0,n);//挨个取字符串  例如"ABCDE" 这里实现的效果是"A" "AB" "ABC" "ABCD" "ABCDE"
            if(s.length() == 1){
                arrvalue[n-1] = 0;
            }else{

                for(int i=1;i<s.length();i++){
                    prefixchar.add(s.substring(0,i));//往前缀容器加字符串
                }
                for(int j=2;j<=s.length();j++){
                    postfixchar.add(s.substring(1,j));//往后缀容器加字符串
                }
                for(int index = 0;index < prefixchar.size();index++){
                    if(prefixchar.get(index).equals(postfixchar.get(index))){ //这里原来写的是prefixchar.get(index) == postfixchar.get(index),这个错误原因就是第1点,找了三个小时
                        samechar.add(prefixchar.get(index));//判断是否相同,往相同容器加字符串
                    }
                }
                for(int index = 0;index < samechar.size();index++){
                    if(samechar.get(index).length()>max){
                        max = samechar.get(index).length();//计算相同字符串容器中所有字符串长度,计算长度最大值
                    }
                }
                arrvalue[n-1] = max;//将最大值赋值给要返回的数组,这个数组是最终求得结果
            }
            prefixchar.clear();
            postfixchar.clear();
            samechar.clear();
            s = "";
            max = 0;//每循环一遍,要进行清空,再进行下一次添加
        }
        return arrvalue;
    }
}

结果如下:
在这里插入图片描述但是正确结果是[0,0,0,0,1,2,0],我写的获取对应匹配值的数组方法一直找不到逻辑出错点,希望得到大佬指点,感谢!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值