【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; } }