找了好几个小时,都推了好几遍,还是没能找出问题出在哪里,求助大佬
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],我写的获取对应匹配值的数组方法一直找不到逻辑出错点,希望得到大佬指点,感谢!!