KMP演算法 leetcode-28
阿新 • • 發佈:2022-03-28
[leetcode 28題](https://leetcode-cn.com/problems/implement-strstr/)
實現 strStr() 函式。
給你兩個字串 haystack 和 needle ,請你在 haystack 字串中找出 needle 字串出現的第一個位置(下標從 0 開始)。如果不存在,則返回 -1 。
說明:
當 needle 是空字串時,我們應當返回什麼值呢?這是一個在面試中很好的問題。
對於本題而言,當 needle 是空字串時我們應當返回 0 。這與 C 語言的 strstr() 以及 Java 的 indexOf() 定義相符。
示例 1:
輸入:haystack = "hello", needle = "ll"
輸出:2
示例 2:輸入:haystack = "aaaaa", needle = "bba"
輸出:-1
示例 3:輸入:haystack = "", needle = ""
輸出:0來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/implement-strstr
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
class Solution { public int strStr(String haystack, String needle) { int m = haystack.length();//i遍歷 intn = needle.length();//j遍歷 if(needle.length()==0){ return 0; } int[] prefix = prefix(needle); int i = 0; int j = 0; for(i = 0; i<m;i++){ while(j>0&& needle.charAt(j) != haystack.charAt(i)){ j = prefix[j-1]; }if(needle.charAt(j) == haystack.charAt(i)){ j++; } if(j == n){ return i-n+1; } } return -1; } //計算模式串的字首表 private int[] prefix(String needle){ int beforeEnd = 0; int[] prefix = new int[needle.length()]; for(int afterEnd = 1; afterEnd<needle.length(); afterEnd++){ while(beforeEnd > 0 && needle.charAt(beforeEnd)!=needle.charAt(afterEnd)){ beforeEnd = prefix[beforeEnd-1]; } if(needle.charAt(afterEnd) == needle.charAt(beforeEnd)){ beforeEnd++; } prefix[afterEnd] = beforeEnd; } return prefix; } }