你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。
你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。
示例 1:
输入:name = “alex”, typed = “aaleex”
输出:true
解释:‘alex’ 中的 ‘a’ 和 ‘e’ 被长按。
示例 2:
输入:name = “saeed”, typed = “ssaaedd”
输出:false
解释:‘e’ 一定需要被键入两次,但在 typed 的输出中不是这样。
提示:
1 <= name.length, typed.length <= 1000
name 和 typed 的字符都是小写字母
直接模拟即可:
class Solution {
public:bool isLongPressedName(string name, string typed) {int nameIdx = 0;int typedIdx = 0;while (nameIdx < name.size() && typedIdx < typed.size()) {if (name[nameIdx] != typed[typedIdx]) {return false;}int nameSameNum = 1;while (nameIdx < name.size() - 1 && name[nameIdx] == name[nameIdx + 1]) {++nameIdx;++nameSameNum;}int typedSameNum = 1;while (typedIdx < typed.size() - 1 && typed[typedIdx] == typed[typedIdx + 1]) {++typedIdx;++typedSameNum;}if (typedSameNum < nameSameNum) {return false;}++nameIdx;++typedIdx;}// 循环结束时,可能name没有遍历完,也有可能typed没有遍历完// 处理没有遍历完的typedwhile (typedIdx < typed.size()) {if (typed[typedIdx] == typed[typedIdx - 1]) {++typedIdx;} else {return false;}}// 如果name没有遍历完,则typed一定不对应namereturn nameIdx == name.size();}
};
如果name的长度为n,typed长度为m,则此算法时间复杂度为O(n+m),空间复杂度为O(1)。