你的朋友正在使用鍵盤輸入他的名字 name。偶爾,在鍵入字元 c 時,按鍵可能會被長按,而字元可能被輸入 1 次或多次。
你將會檢查鍵盤輸入的字元 typed。如果它對應的可能是你的朋友的名字(其中一些字元可能被長按),那麼就返回 true。
示例 1:
輸入:name = 「alex」, typed = 「aaleex」
輸出:true
解釋:『alex』 中的 『a』 和 『e』 被長按。
示例 2:
輸入:name = 「saeed」, typed = 「ssaaedd」
輸出:false
解釋:『e』 一定需要被鍵入兩次,但在 typed 的輸出中不是這樣。
示例 3:
輸入:name = 「leelee」, typed = 「lleeelee」
輸出:true
示例 4:
輸入:name = 「laiden」, typed = 「laiden」
輸出:true
解釋:長按名字中的字元並不是必要的。
**實現:
c++:
第一種方法:
要滿足返回true的條件與兩個因素有關:
字元在name和typed**現的順序要保持一致;
對於每個字元在typed中每次連續出現的長度不能小於name中連續出現的長度;
例如name = 「saeede」, typed = "ssaaeeddee"時。
name中字元出現的順序是saede。typed**現的順序也是saede;且它們連續出現的個數,name是[1,1,2,1,1], typed是[2,2,2,2,2]。所以結果是true。
具體編碼的時候,定義兩個變數c1和c2,分別用來統計兩個字串同一字元連續出現的次數。同時遍歷name和typed。
對於每個字串,遇到不同字元的時候就暫停,比較不同的字元是否相等,如果相等再比較c2是否大於等於c1(c1和c2存放是前乙個字元連續出現的次數)。如果字元不等或者,c2小於c1則返回false,繼續直到遍歷結束。
這個演算法需要遍歷兩個字串做統計,演算法的複雜度是o(len(name)+len(typed))。
第二種方法:
如果typed可以返回true,那麼除去typed中那些多鍵入的字元後,新的字元一定是和name相等的。
具體實現的方法依然是通過統計的方式。
我們定義乙個變數c來做統計。遍歷typed:
如果相應位置typed中的字元和name中的字元相等,那麼c加1,接著比較typed和name的下乙個字元;
否則,拿typed中的當前字元和typed的前乙個字元再做比較,如果相等,說明這是乙個多鍵入的字元,不做統計,typed移動到下乙個字元,再和name中的那個字元做比較。
如此遍歷下去,如果中間發生:typed的字元和name中的字元不等且typed的當前字元和typed的前乙個字元也不等,應該返回false。
如果對typed的遍歷成功結束,需要比較c和name的長度是否相等(考慮name是"dee",typed是"dde"的情況)。
該方法僅僅對typed遍歷,所以演算法複雜度為o(len(typed))。
流程如下圖所示:
# 設定標誌位
c = 0
for i in range(len(typed)):
if name[c] == typed[i]:
c += 1
elif typed[i] != typed[i-1]:
return false
if c >= len(name):
break
return c==len(name)
LeetCode925 長按鍵入
你的朋友正在使用鍵盤輸入他的名字 name。偶爾,在鍵入字元 c 時,按鍵可能會被長按,而字元可能被輸入 1 次或多次。你將會檢查鍵盤輸入的字元 typed。如果它對應的可能是你的朋友的名字 其中一些字元可能被長按 那麼就返回 true。示例 1 輸入 name alex typed aaleex ...
LeetCode 925 長按鍵入
你的朋友正在使用鍵盤輸入他的名字 name。偶爾,在鍵入字元 c 時,按鍵可能會被長按,而字元可能被輸入 1 次或多次。你將會檢查鍵盤輸入的字元 typed。如果它對應的可能是你的朋友的名字 其中一些字元可能被長按 那麼就返回 true。示例 1 輸入 name alex typed aaleex ...
leetcode925 長按鍵入
你的朋友正在使用鍵盤輸入他的名字 name。偶爾,在鍵入字元 c 時,按鍵可能會被長按,而字元可能被輸入 1 次或多次。你將會檢查鍵盤輸入的字元 typed。如果它對應的可能是你的朋友的名字 其中一些字元可能被長按 那麼就返回 true。示例 1 輸入 name alex typed aaleex ...