# LeetCode 解題筆記 (String類型題目) 解題時要注意的重點 1. 一題多解,找不同的思維;可以看討論區的解題方法 2. 不要盲目刷題,至少要帶走一些想法 3. 精通一種解法;某些題型適合某一種演算法,可以做統整 4. 定義題目內容與輸出的結果;例如考官到底要什麼;題目給的例子是不是分類過的array ![](https://i.imgur.com/OGke5Sr.png) ![](https://i.imgur.com/rqE3iHd.png) [影片來源](https://www.youtube.com/watch?v=NdWYxz3izH4) ## [難度Easy] 類型:String ### 014. Longest Common Prefix [題目網址](https://leetcode.com/problems/longest-common-prefix/) > 給一堆字串,回傳他們共有的前贅詞(Prefix) > Input: ["flower","flow","flight"] Output: "fl" > ``` var longestCommonPrefix = function (strs) { if(strs.length === 0) return '' let same = strs[0] for(let i = 1; i < strs.length; i++){ const temp = strs[i] let j = 0 for(; j < same.length; j++){ if (same[j] !== temp[j]) break } same = same.slice(0, j) } return same }; ``` 1. 確認給予的字串是不是只有'',是就回傳'' 2. 將第一個文字整段當作前墜,開始向後跟其他文字比較 3. 當發現第J個不相同時,刪減文字,接著逐一檢查下去 4. [想法來源](https://skyyen999.gitbooks.io/-leetcode-with-javascript/content/questions/14md.html) ``` var longestCommonPrefix = function (strs) { if(strs.length === 0) return '' let same = strs[0] let i = 1 while(i < strs.length){ while(strs[i].indexOf(same)){ same = same.substring(0, same.length - 1) } i++ } return same }; ``` 概念同上,但是速度跟使用的資源都最優秀 ### 020. Valid Parentheses [題目網址](https://leetcode.com/problems/valid-parentheses/) > 給一個只包含'(', ')', '{', '}', '[' , ']'這些括號字元的字串,判斷這些括號是不是合法的。 右括號必須依照正確的順序出現,"()" 與 "()[]{}" 都是合法的,但"(]" 和 "([)]"就不是。 ``` var isValid = function (s) { if( s.length === 1) return false const obj = { '(': 1, ')': -1, '{': 2, '}': -2, '[': 3, ']': -3 } const left = ['(', '[', '{'] const right = [')', ']', '}'] const stack = [] for (let i = 0; i < s.length; i++){ if(left.indexOf(s[i]) > -1) { stack.push(s[i]) } else if (right.indexOf(s[i]) > -1) { const test = stack.pop() if(obj[s[i]] + obj[test] !== 0) return false } } return stack.length === 0 }; ``` 概念上來說,(、[、{、會有一個相對應的、}、]、),所以可以把這兩組當作抵銷的概念作處理,先從index = 0開始往後歷遍,如果遇到左側['(', '[', '{'],就存起來,遇到右側時,就拿出來比較,如果是合法的,那應該最後貯存的左側陣列stack會是0 [來源](https://skyyen999.gitbooks.io/-leetcode-with-javascript/content/questions/20md.html) ``` var isValid = function (s) { while(s.indexOf('()') > -1 || s.indexOf('[]') > -1 || s.indexOf('{}') > -1 ){ s = s.replace('()','').replace('[]','').replace('{}','') } return s.length === 0 }; ``` 檢查有沒有合法括號,有的話就刪除,直到沒有為止,最後檢查是否還有殘留的括號 ### 038. Count and Say [題目網址](https://leetcode.com/problems/count-and-say/) ![](https://i.imgur.com/od2mR0L.png) ``` var countAndSay = function (n) { let initi = '1' for (let i = 1; i < n; i++) { let count = 1 let string = '' let tempValue = initi[0] for (let j = 1; j <= initi.length; j++) { if (tempValue === initi[j]) { count++ } else if (tempValue !== initi[j]) { string += `${count}` + tempValue count = 1 tempValue = initi[j] } } initi = string } return initi }; ``` 1. 建立一個初始值initi = '1',當傳入的數值n大於1時才開始閱讀數字 2. 建立一個初始的計算條件,首先要計算數字的數量,因為第一個數字已經被納入計算範圍了,所以let count = 1 3. 接著建立暫時存放累積閱讀結果的string,以及存放暫時閱讀位置的tempValue,初始值是initi[0] 4. 開始計算,因為第一個數值要跟第二個(j=1)比較,所以for-loop的停止條件為j <= initi.length (如果字串是'1',那長度就是1,j = 1時也要進行閱讀) 5. 判斷數值是否跟下一個數值相同,是的話就數量count+1,不是的話,就停止計算,更新結果給string 6. 進行下一個數字的閱讀,直到結束為止 7. 將閱讀結果給init,繼續下一輪閱讀 8. [想法相同](https://skyyen999.gitbooks.io/-leetcode-with-javascript/content/questions/38md.html) P.S. 看了其他方法,好像都差不多,其他語言的解法看不懂,所以只寫一個解法 ###### tags: `LeetCode` `string` `javascript`