925. 长按键入

题目

自己写的:

class Solution {
public:
    bool isLongPressedName(string name, string typed) {
        int slow = 0, fast = 0;
        while (fast < typed.size())
        {
            if (slow < name.size() && typed[fast] == name[slow])
                fast++, slow++;
            else if (fast > 0 && typed[fast] == typed[fast - 1])
                fast++;
            else 
                return false;
        }
        if (slow == name.size())
            return true;
        return false;
    }
};

特别要注意这段代码:

else if (fast > 0 && typed[fast] == typed[fast - 1])

一定要有前置条件fast > 0,否则会报错,因为我们后面用到了表示下标的fast - 1,没有这个前置条件的话,就可能会让下标为负,自然会报错,比如当name = “a”,typed = “b”时,就会报错。

卡哥思路差不多,但是可能更科学吧。

卡哥代码:

class Solution {
public:
    bool isLongPressedName(string name, string typed) {
        int i = 0, j = 0;
        while (i < name.size() && j < typed.size()) {
            if (name[i] == typed[j]) { // 相同则同时向后匹配
                j++; i++;
            } else { // 不相同
                if (j == 0) return false; // 如果是第一位就不相同直接返回false
                // j跨越重复项,向后移动,同时防止j越界
                while(j < typed.size() && typed[j] == typed[j - 1]) j++;
                if (name[i] == typed[j]) { // j跨越重复项之后再次和name[i]匹配
                    j++; i++; // 相同则同时向后匹配
                }
                else return false;
            }
        }
        // 说明name没有匹配完,例如 name:"pyplrzzzzdsfa" type:"ppyypllr"
        if (i < name.size()) return false;

        // 说明type没有匹配完,例如 name:"alex" type:"alexxrrrrssda"
        while (j < typed.size()) {
            if (typed[j] == typed[j - 1]) j++;
            else return false;
        }
        return true;
    }
};

来源链接:https://www.cnblogs.com/hisun9/p/18678420

请登录后发表评论

    没有回复内容