LeetCode 每日一题 925.长键输入

10.21 打卡

LeetCode每日一题 925.长键输入

image-20201021154112348

解题思路:

​ 利用双指针,指针ij,指针i扫描name,指针j扫描typed。

​ 当 name[i] == typed[j] 的时候,并且指针i小于name的长度,此时指针 i 和 j 都向右移动即 i++,j++

​ 当 name[i] != type[j] 的时候,此时有三种情况:

​ (1) 当 name[i-1] 存在(即 j > 0) 并且 typed[j] == typed[j-1] , 这种情况就是题目所说的按键被长按的情况,即输入的字符被输入多次,所 以此时只移动指针j,指针i不移动,继续下一次循环判断;

​ (2) 当 name[i-1] 不存在(即比较的第一个字符就不相同)时 ,证明一开始就输入错误,此时return false;或者 当name[i-1] 存在但是 type[j] != typed[j-1]时,此时说明输入的字符即不是它名字中的字符也不是因为长按而输进去的,所以也 return false。

image-20201021162018745

下面直接贴出代码

JAVA

class Solution {
    public boolean isLongPressedName(String name, String typed) {
         int i = 0, j = 0;  // 从头开始

        while(j < typed.length()){
            if (i < name.length() && name.charAt(i) == typed.charAt(j)){  // 相等的时候i和j都向前进
                i++;
                j++;
            } else if (j > 0 && typed.charAt(j) == typed.charAt(j-1)) {  // 出现长按,i不动,j++
                j++;
            }else 
                return false;   // 即不是长按也不相等,此时指针j还没走完整个typed,所以证明输错了
        }
        return i == name.length();  
        // 指针j扫描完typed后,如果指针i和name的长度相等,即证明指针i也扫描完name,
        // 并且每一个字符都和typed匹配(包括长按)此时name就可能是“你朋友的名字”
    }
}

GO

func isLongPressedName(name string, typed string) bool {
	i := 0
	j := 0
	for j < len(typed) {
		if i < len(name) && name[i] == typed[j] {
			i++
			j++
		} else if j > 0 && typed[j] == typed[j-1] {
			j++
		} else {
			return false
		}
	}
	return i == len(name)
}

复杂度分析:

  • 时间复杂度:O(N+M),其中 M,N分别为两个字符串的长度
  • 空间复杂度:O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值