1. 程式人生 > 實用技巧 >長按鍵入

長按鍵入

長按鍵入

你的朋友正在使用鍵盤輸入他的名字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即可,之後定義兩個指標ik分別為遍歷nametyped字串的指標,之後定義nname字串的長度,之後定義迴圈,在這裡我是用的是for,其實使用while更好一些,之後取得當前的字元,判斷兩個指標指向的字元,如果不同直接返回false,快取兩個指標的值,之後使用while使得兩個指標總是指向與當前字元不同的第一個字元,之後通過快取的指標判斷typed的當前的字元的數量是否大於等於name

的當前的字元的數量,按照題目要求是對於當前字元typed值的數量需要大於等於name值的數量,如果不符合直接返回false,之後判斷兩個指標是否都遍歷完成,如果沒有遍歷完成則返回false,最後所有條件都滿足返回true即可。

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://leetcode-cn.com/problems/long-pressed-name/