经典BM利用hash 处理的问题, 找substring位置,在haystack里面捞针
···java
public class Solution {
public int strStr(String haystack, String needle) {// ref http://zjalgorithm.blogspot.com/2014/12/leetcode-in-java-implement-strstr.html
int m = haystack.length();
int n = needle.length();
//brute force
// int i=0, j=0;
// for(i=0;i<=m-n;i++){
// for(j=0;j<n;j++){
// if(haystack.charAt(i+j)!=needle.charAt(j)) break;
// }
// if(j==n) return i;
// }
// BM
int[] hash = new int[256];
for(int i=0;i<256;i++){
hash[i]=-1;
}
for(int i=0;i<n;i++){
hash[needle.charAt(i)]=i;
}
int skip=0;
for(int i=0;i<= m-n; i += skip){
skip=0;
for(int j=n-1; j>=0; j--){ 从后往前
if(haystack.charAt(i+j)!=needle.charAt(j)){
skip = Math.max(1,j-hash[haystack.charAt(i+j)]);
break;
}
}
if(skip==0) return i;
}
return -1;
}
}
```