Skip to main content

0028 - Find the Index of the First Occurrence in a String

大意

找出目標字串片段第一次出現的起始 index

例如 mississippi ,目標字串為 issip,那 index 要回傳為 4

個人思考

因為經常 Time out,我不知道是哪裡出了問題。

最初是這樣寫的,但是在測資上爆掉了:

class Solution {
    public int strStr(String haystack, String needle) {
        int sameCount = 0;
        int lastSuccess = 0;
        int count = 0;
        
        while(count < haystack.length()){
            if(sameCount == needle.length()){
                return count - sameCount;
            }

            if(haystack.charAt(count) != needle.charAt(sameCount)){
                sameCount = 0;
                if(lastSuccess != 0){
                    count = lastSuccess;
                    continue;
                }
            } else {
                sameCount++;
                lastSuccess = count;
            }
            count++;
        }

        if(sameCount == needle.length() - 1){
            return haystack.length() - sameCount;
        } else {
            return -1;
        }
    }
}

後來看了一下解答,加上理解解題思路之後,就修改成這樣:

class Solution {
    public int strStr(String haystack, String needle) {
        int index = 0;

        // 一定要先排除長度小於比較子字串的狀況
        if(haystack.length() < needle.length()){
            return -1;
        }
        
        // 每換一個起頭就暴力跑完子字串
        // 迴圈結束條件:如果子字串長度 <= 要比較字串長度,那就永遠都不會超過
        for(index = 0;index <= haystack.length() - needle.length(); index++){
            int subCount = 0;

            // 暴力迴圈跑完子字串,發現不同就跳迴圈
            for(subCount = 0; subCount < needle.length(); subCount++){
                if(haystack.charAt(index + subCount) != needle.charAt(subCount)){
                    break;
                }
            }

            // 只有當子字串 Count 長度等於子字串實際長度時,代表找到子字串了,回傳起始 index
            if(subCount == needle.length()){
                return index;
            }
        }

        // 如果都跑完迴圈還是找不到,那就是真的找不到
        return -1;
    }
}