1. 程式人生 > >隨筆-實現strStr() (找到字串子串)

隨筆-實現strStr() (找到字串子串)

題目:

實現 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;
    }
}