ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
:-: 6.6 长按键入 ***** **题干:** 你的朋友正在使用键盘输入他的名字 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 = "pyplrz", typed = "ppyypllr" 输出:false ``` 示例 5: ``` 输入:name = "laiden", typed = "laiden" 输出:true 解释:长按名字中的字符并不是必要的。 ``` 提示: ``` name.length <= 1000 typed.length <= 1000 name 和 typed 的字符都是小写字母。 ``` **题目分析:** 此题可用循环对比验证解法。 **新手有可能遇到的解题思路陷阱:** 忽略的name字符串中也有重复的字符,或者忽略了示例4的情况。 **解题思路分析以及代码实现:** 第一种思路:循环对比,typed中重复字符提前与name中字符提前预判,并且如果连续两次不相同则返回输入错误,如name的字符没有匹配完毕,typed的字符就匹配完毕,则输入错误 。 第一种思路代码: ``` public boolean isLongPressedName(String name, String typed) { char[] names = name.toCharArray(); char[] typeds = typed.toCharArray(); int i = 0, j = 0; if (names[0] != typeds[0]) {// 判断首字符是否相同,如若不同则不必进行判断 return false; } boolean sign = false; while (i < names.length - 1) { if (typeds[j] == names[i]) { j++; if (j > typeds.length - 1) {// 如name的字符没有匹配完毕,typed的字符就匹配完毕,则输入错误 return false; } if (i < names.length - 1 && typeds[j] == names[i + 1]) {// 防止将name中重复的字符忽略 i++; } sign = false; } else { if (sign) {// 连续两次不同,则不是重复输入,而是输入错误 return false; } i++; sign = true; } } return true; } ``` **复杂度分析** 时间复杂度:O(n)。 空间复杂度:O(1)。 第二种思路:循环对比,typed中重复字符与前一位对比,如果与name当前字符值不同且与它前一位字符也不同,则输入错误,如name的字符没有匹配完毕,typed的字符就匹配完毕,则输入错误 。 第二种思路代码: ``` public boolean isLongPressedName(String name, String typed) { char[] names = name.toCharArray(); char[] typeds = typed.toCharArray(); int i = 0, j = 0; while (i < names.length) { if (j >= typeds.length) return false; if (names[i] == typeds[j]) { i++; j++; } else { if (j != 0 && typeds[j] == typeds[j - 1]) j++; else return false; } } return true; } ``` **复杂度分析** 时间复杂度:O(n)。 空间复杂度:O(1)。 **若有理解错误的、写错的地方、更好的思路,方法,望各位读者评论或者发邮件指正或指点我,不胜感激。**