長按鍵入
阿新 • • 發佈:2020-10-21
長按鍵入
你的朋友正在使用鍵盤輸入他的名字name
。偶爾,在鍵入字元c
時,按鍵可能會被長按,而字元可能被輸入1
次或多次。
你將會檢查鍵盤輸入的字元typed
。如果它對應的可能是你的朋友的名字(其中一些字元可能被長按),那麼就返回True
。
示例
輸入:name = "alex", typed = "aaleex"
輸出:true
解釋:'alex' 中的 'a' 和 'e' 被長按。
輸入:name = "saeed", typed = "ssaaedd"
輸出:false
解釋:'e' 一定需要被鍵入兩次,但在 typed 的輸出中不是這樣。
輸入:name = "leelee", typed = "lleeelee" 輸出:true
輸入:name = "laiden", typed = "laiden"
輸出:true
解釋:長按名字中的字元並不是必要的。
題解
/** * @param {string} name * @param {string} typed * @return {boolean} */ var isLongPressedName = function(name, typed) { if(name === typed) return true; var i=0, k=0; var n = name.length; for(; i<n;){ let char = name[i]; if(name[i] !== typed[k]) return false; let catchedI = i; let catchedK = k; while(name[++i] === char); while(typed[++k] === char); if(i - catchedI > k - catchedK) return false; } if(i !== n || k !== typed.length) return false; return true; };
思路
利用雙指標的策略,分別對於兩個字串設定一個指標,對於兩個字串進行遍歷,處理重複的字元,使指標總是指向下一個不同的字元,判斷輸入是否達到足夠的數量,以及最後判斷是否完全遍歷字串即可,首先判斷字串是否相同,如果相同直接返回true
即可,之後定義兩個指標i
與k
分別為遍歷name
與typed
字串的指標,之後定義n
為name
字串的長度,之後定義迴圈,在這裡我是用的是for
,其實使用while
更好一些,之後取得當前的字元,判斷兩個指標指向的字元,如果不同直接返回false
,快取兩個指標的值,之後使用while
使得兩個指標總是指向與當前字元不同的第一個字元,之後通過快取的指標判斷typed
的當前的字元的數量是否大於等於name
typed
值的數量需要大於等於name
值的數量,如果不符合直接返回false
,之後判斷兩個指標是否都遍歷完成,如果沒有遍歷完成則返回false
,最後所有條件都滿足返回true
即可。
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://leetcode-cn.com/problems/long-pressed-name/