[leetcode] Implement strStr()
Implement strStr().
Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.
https://oj.leetcode.com/problems/implement-strstr/
思路:目测有BF法,BMP法,BM法等。
BF法:已删除。
第二遍记录:
BF法:
public class Solution { public String strStr(String hayStack, String needle) { if (hayStack == null || needle == null) return null; char[] t = hayStack.toCharArray(); char[] p = needle.toCharArray(); int i=0,j=0; while(i<t.length&&j<p.length){ if(t[i]==p[j]){ i++; j++; }else{ i=i-j+1; j=0; } } if(j==p.length){ return hayStack.substring(i-j); }else{ return null; } } }
KMP法:
注意空字符串“”,生成next数组时越界。next[0]=-1;
注意相比BF方法,主函数需要判断j=-1的情况,因为next[j]可能等于-1而导致越界。
public class Solution { public String strStr(String hayStack, String needle) { if (hayStack == null || needle == null) return null; char[] t = hayStack.toCharArray(); char[] p = needle.toCharArray(); int[] next = geneNext(needle); int i=0,j=0; while(i<t.length&&j<p.length){ if(j==-1||t[i]==p[j]){ i++; j++; }else{ j=next[j]; } } if(j==p.length){ return hayStack.substring(i-j); }else{ return null; } } private int[] geneNext(String ps){ char[] p = ps.toCharArray(); int[] next = new int[p.length]; if(next.length==0) return next; next[0]=-1; int j=0; int k=-1; while(j<p.length-1){ if(k==-1||p[j]==p[k]){ j++; k++; next[j]=k; }else{ k=next[k]; } } return next; } }
第三遍记录:
p为“”直接返回t。
注意next数组的求法。
第四遍记录:
BF法都记不清了,给跪了,双指针法。i和j分别指向两个字符串的当前比较字符。
public class Solution { public String strStr(String hayStack, String needle) { if(hayStack == null || needle == null) return null; // It will be convenient to change String to char array first char[] t = hayStack.toCharArray(); char[] p = needle.toCharArray(); int i =0,j=0; while(i<t.length&&j<p.length){ if(t[i]==p[j]){ i++; j++; }else{ //don't change j first because i will use j... //i-j stands for the head of this comparison, +1 means to start from next char. i = i-j+1; j=0; } } if(j==p.length) return hayStack.substring(i-j); else return null; } }
KMP
基本思想:当失配时,i指针不回溯,只回溯j指针,j指针回溯到什么位置需要根据p字符串的结构计算出。
public class Solution { public String strStr(String hayStack, String needle) { if(hayStack == null || needle == null) return null; //if needle is "" if(needle.isEmpty()) return hayStack; // It will be convenient to change String to char array first char[] t = hayStack.toCharArray(); char[] p = needle.toCharArray(); int[] next = getNext(needle); int i =0,j=0; while(i<t.length&&j<p.length){ //don't forget j == -1 if(j==-1||t[i]==p[j]){ i++; j++; }else{ j=next[j]; } } if(j==p.length) return hayStack.substring(i-j); else return null; } private int[] getNext(String ps){ // we assume ps is not "" char[] p = ps.toCharArray(); int[] next = new int[p.length]; next[0]=-1; int k =-1; int j = 0; //be careful p.length-1 while(j<p.length-1){ if(k==-1||p[k]==p[j]){ k++; j++; next[j] = k; }else{ k=next[k]; } } return next; } }
参考:
http://www.cnblogs.com/yjiyjige/p/3263858.html
http://blog.csdn.net/kenden23/article/details/17029625
http://fisherlei.blogspot.com/2012/12/leetcode-implement-strstr.html