Implement strStr().Return the index of the first occurrence of needle in haystack, or -1
if needle is not part of haystack.算法Example 1:數組
Input: haystack = "hello", needle = "ll" Output: 2 Example 2:優化
Input: haystack = "aaaaa", needle = "bba" Output: -1 Clarification:this
What should we return when needle is an empty string? This is a great
question to ask during an interview.codeFor the purpose of this problem, we will return 0 when needle is an
empty string. This is consistent to C's strstr() and Java's indexOf().
須要注意邊界條件,例如把正常邏輯全放到對haystack的循環體中,但haystack可能爲空,邏輯將會走不到string
public int strStr(String haystack, String needle) { char[] a1=haystack.toCharArray(); char[] a2=needle.toCharArray(); if(a2.length==0) return 0; for(int i=0;i<a1.length;i++){ boolean flag=true; for(int j=0;j<a2.length;j++){ if(i+j>=a1.length || a1[j+i]!=a2[j]) { flag=false; break; } } if(flag) return i; } return -1; }
上面的複雜度是o(n*m),在某些重複串較多的狀況下,時間不理想,上面的使用暴力匹配的思想,能夠用KMP算法來優化
KMP的原理和迴文串的馬拉車算法相似,利用已有的信息去除一些無用的判斷
例如
P:ABCABC D……
T:ABCABC E
這個時候判斷
ABCABC D……
ABCAB CE
是沒有意義的
由於當須要回溯找串的時候須要保證
23456==12345io
123456 7……
12345 68
而上面的關係徹底取決於T本身,能夠提早計算,也就是說咱們在發生不匹配的時候,能夠直接肯定須要相對移動的值,不須要徹底回溯
咱們的問題轉化爲
T: ABCABCABCABC Y
T':ABCABCABCABC
在Y位上發生不匹配後,肯定全部的k位知足T’的前k位等於後k位
這樣看起來儲存k位置的是個二維結構,
看上面的例子,這時候看起來須要回溯的狀況爲[ABC,ABCABC,ABCABCABC]
有一個不容易發現的問題
{n1 n1}
{n2 n2}
當k1>k2時,k2必定是k1的子串,這樣就能造成線性結構,這就是next數組,求next數據是一個動態規劃的過程
咱們定義next[k]是k位置以前前綴和後綴重合最大的長度原理
public int strStr(String haystack, String needle) { char[] a1=haystack.toCharArray(); char[] a2=needle.toCharArray(); int l1=a1.length; int l2=a2.length; if(l2==0) return 0; int[] next=new int[l2]; for(int i=2;i<l2;i++){ int t=next[i-1]; while(t!=-1){ if(a2[t]==a2[i-1]) { next[i]=t+1; break; } else { if(t==0) break; t=next[t]; } } } int i=0; int j=0; while(i<l1 && j<l2){ if(a1[i]==a2[j]){ i++; j++; }else{ if(next[j]!=0){ j=next[j]; }else{ i=i-j+1; j=0; } } } return j==l2?i-j:-1; }