1. 程式人生 > >【LeetCode】28 實現strSTR()

【LeetCode】28 實現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()定義相符。


解題要點:
1 此題目的就是讓你實現java中的indexOf。(看到提交中3ms、4ms的直接返回indexOf…emmmm我就當是在測試吧
2 這道題也做了兩遍,第一次用簡單粗暴的雙重迴圈,第二次閱讀了indexOf原始碼並實現了它。然而,重點是,這兩次提交的結果速度相差只有1ms,刷到現在我才發現,其實leetcode的重點是實現而不是速度,回饋給你的用時只是為了讓你知道不要讓你的程式耗太~ 長~時間,還有幫助你剔除有問題的程式碼。

解題思路:
雙重迴圈的思路應該不用說了,把indexOf的思路講一下吧
1 日常處理異常資料,如needle字串為""(此處回顧一下JAVA中String為null和"“的區別:null是指沒有這個物件,就是“我們村沒有老王這個人,也沒有老王的房子”;而”"是指“我們村老王的房子在村西口,但是我們從來沒見過他,他連個逗號也不是”)則返回0。
2 找到needle字串第一個字元,對haystack遍歷找到與此字元相同的字元位置,用i記錄下來
3 在此i處向後遍歷,比較兩個字串對應位置的元素,如果最後比較結束還未跳出迴圈,則返回該i
4 若在i處未找到答案,繼續對haystack進行遍歷

實現indexOf的程式碼:

class Solution {
    public int strStr(String haystack, String needle) {
        Integer result = -1;
        
        char[] hay = haystack.toCharArray();
        char[] nee = needle.toCharArray();
                
        if(nee.length == 0)
            return 0;
        
        char first = nee[0];
        int max = hay.length - nee.length;
        
        for (int i = 0;i <= max;i++){
            
            if (hay[i] != first){
                while (++i<=max && hay[i] != first);
            }
            
            if (i <= max){
                int j = i + 1;
                int end = j + nee.length - 1;
                
                for (int k = 1; j < end && hay[j] == nee[k];j++,k++);
                
                if (j == end){
                    return i;
                }
            }
        }
        return result;
    }
}