Implement strStr().
Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Examples:
Input:
haystack = “hello”, needle = “ll”
Output:
2
Input:
haystack = “aaaaa”, needle = “bba”
Output:
-1
Solutions
- 很明显是一个字符串匹配的问题,自然想到用KMP算法
- 难的是会不会KMP…
- KMP本身难点在getNext()函数,具体见代码和注释
C++ Codes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| class Solution { public: int myNext[1000000]; int strStr(string haystack, string needle) { int pos = KMP(haystack,needle); return pos; } void getNext(string p){ memset(myNext,-1,sizeof(myNext)); int j=0; int k=-1;
while(j<p.length()-1){ if(k==-1 || p[j]==p[k]){ if(p[++j] == p[++k]){ myNext[j]=myNext[k]; } else { myNext[j]=k; } } else { k=myNext[k]; } } } int KMP(string ts, string ps){ int i=0; int j=0; int tsLen = ts.length(), psLen = ps.length(); if(tsLen==0 && psLen==0) return 0; if(tsLen==0) return -1; if(psLen==0) return 0; getNext(ps); while(i<tsLen && j<psLen){ if(j==-1 || ts[i]==ps[j]){ i++; j++; } else{ j=myNext[j]; } } if(j==ps.length()){ return i-j; } else { return -1; } } };
|
总结