KMP解决的是包含问题,如字符串里是否包含另一个子串
package com.kmoonwang.mywenda;
import java.util.Stack;
public class Solution {
public int getIndexOf(String str1,String str2) {
if(str1 == null || str2 == null || str1.length() < 1 || str2.length() < 1)
return -1;
int p1 = 0;
int p2 = 0;
int[] arr = getnext(str2);
while(p1 < str1.length() && p2 < str2.length()){
if(str1.charAt(p1) == str2.charAt(p2)){
p1++;
p2++;
}else if(arr[p2] == -1){
p1++;
}else{
p2 = arr[p2];
}
}
return p2 == str2.length()? p1-p2:-1;
}
//获得str2的最长前缀的数组
public int[] getnext(String str2){
if(str2.length() == 1)
return new int[]{-1};
int[] arr = new int[str2.length()];
arr[0] = -1;
arr[1] = 0;
int i = 2;
int cur = 0;
while(i < str2.length()){
if(str2.charAt(i-1) == str2.charAt(cur)){
arr[i++] = ++cur;
}else if(cur > 0){
cur = arr[cur];
}else{
arr[i++] = 0;
}
}
return arr;
}
public static void main(String[] args){
Solution s = new Solution();
//s.ReverseSentence("I am a student");
int flag = s.getIndexOf("asdsfsdfds","fsdfds");
System.out.println(flag);
}
}
应用:
判断一个树是否是另一个树的子树
把树进行序列化,即将问题转换为字符串是否包含子串的问题