KMP解法
文字描述
class Solution {
public int KMP(String str,String que){//待求解字符串以及总字符串
int length=str.length();
int[][] dp=new int[length][256];//定义数组
int pre=0;//设置前导值
dp[pre][str.charAt(0)]=1;//初始状态为0,当且仅当遇到第一个字符时进入下一个状态
for(int i=1;i<length;i++){
for(int j='a';j<'z'+1;j++){
//继承前导状态的值
dp[i][j]=dp[pre][j];
}
//遇到可匹配字符串时,状态向前推进一个
dp[i][str.charAt(i)]=i+1;
//更新下一状态的前导状态
pre=dp[pre][str.charAt(i)];
}
//对字符串进行匹配
int m=0,k=0;
while(m<length&&k<que.length()){
m=dp[m][que.charAt(k)];
k++;
}
if(m==length)
return (k-length);
else
return -1;
}
public int strStr(String haystack, String needle) {
if(needle.isEmpty())
return 0;
if(haystack.isEmpty())
return -1;
return KMP(needle,haystack);
}
}
Sunday解法
文字描述
class Solution {
public int strStr(String haystack, String needle) {
if(needle.isEmpty())
return 0;
if(haystack.isEmpty())
return -1;
int length=needle.length();
Map map=new HashMap();
for(int i=0;i<length;i++){
map.put(needle.charAt(i),length-i);
}
int m=0;
while(m+length-1<haystack.length()){
if(haystack.substring(m,m+length).equals(needle))
return m;
else if(m+length<haystack.length()&&map.containsKey(haystack.charAt(m+length)))
m+=(int)map.get(haystack.charAt(m+length));
else
m+=length;
}
return -1;
}
}