1. 程式人生 > 其它 >KMP演算法 leetcode-28

KMP演算法 leetcode-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遍歷
        int
n = 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; } }