隨筆-實現strStr() (找到字串子串)
阿新 • • 發佈:2018-12-25
題目:
實現 strStr() 函式。
給定一個 haystack 字串和一個 needle 字串,在 haystack 字串中找出 needle 字串出現的第一個位置 (從0開始)。如果不存在,則返回 -1。
示例 1:
輸入: haystack = “hello”, needle = “ll”
輸出: 2
示例 2:
輸入: haystack = “aaaaa”, needle = “bba”
輸出: -1
說明:
當 needle 是空字串時,我們應當返回什麼值呢?這是一個在面試中很好的問題。
對於本題而言,當 needle 是空字串時我們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符。
庫函式實現:
class Solution { public int strStr(String haystack, String needle) { if(haystack.length()<needle.length() || haystack==null||needle==null){ return -1; } if(haystack.length()==0||needle.length()==0){ return 0; } return haystack.indexOf(needle); //查詢字串是不是包含此字串; } }
思路:具體實現為KMP演算法實現 ,如果不瞭解KMP 請參考 KMP演算法詳解
class Solution { private int[] nextKmp(int [] next , String needle){ if(next.length==1){ next[0]=-1; return next; } next[0]=-1; next[1]=0; int k=0; int j=2; while(j<next.length){ if(k==-1 || needle.charAt(j-1)==needle.charAt(k)){ next[j]=k+1; j++; k++; }else { k=next[k]; } } return next; } public int strStr(String haystack, String needle) { if(haystack.length()<needle.length() || haystack==null||needle==null){ return -1; } if(haystack.length()==0||needle.length()==0){ return 0; } int [] next=new int [needle.length()]; next=nextKmp(next,needle); int i=0; int j=0; while(i<haystack.length()&&j<needle.length()){ if(j==-1||haystack.charAt(i)==needle.charAt(j)){ i++; j++; }else{ j=next[j]; } } if(j==needle.length()){ return i-j; } return -1; } }