public class Main{
// 获取next数组,next表示前后公共缀的长度
private static int[] getNext(String t) {
int[] next = new int[t.length()];
next[0] = -1;
int j = 0, k = -1;
char[] cs = t.toCharArray();
while(j < cs.length - 1){
if(k == -1 || cs[j] == cs[k]){
j++;k++;
next[j] = k;
}else{
k = next[k];
}
}
return next;
}
// 判断s是否包含t子串
private static boolean isContains(String s, String t, int[] next) {
int i = 0, j = 0;
char[] cs = s.toCharArray();
char[] tcs = t.toCharArray();
while(i < s.length() && j < t.length()){
if(j == -1 || cs[i] == tcs[j]){
i++;j++;
}else{
j = next[j];
}
}
// t走到结尾了,表示包含
return j >= t.length();
}
/**
时间复杂度:O(m+n)
**/
public static void main(String[] args) {
String s = "aaaaaab";
String t = "aaab";
int[] next = getNext(s);
boolean b = isContains(s, t, next);
System.out.println(b);
}
}
字符串匹配KMP
于 2023-04-22 16:01:00 首次发布
该代码实现了一个Java程序,使用KMP算法检查一个字符串(s)是否包含另一个字符串(t)作为子串。getNext方法生成next数组,用于存储前后公共前缀的长度,isContains方法利用next数组进行字符串匹配。整体时间复杂度为O(m+n)。
摘要由CSDN通过智能技术生成