小哆啦解题记:字符串子序列大冒险

145 阅读4分钟

小哆啦解题记:字符串子序列大冒险

小哆啦开始刷力扣的第二十一天

392. 判断子序列 - 力扣(LeetCode)

神秘任务降临

在代码王国里,小哆啦一直是个热爱挑战的编程小能手。这天,神秘的编程精灵给小哆啦发布了一个任务:判断字符串 s 是否为字符串 t 的子序列。这可把小哆啦的好奇心勾起来了,他摩拳擦掌,准备大干一场。

就在小哆啦对着任务说明抓耳挠腮时,编程高手小智溜达了过来。小智拍拍小哆啦的肩膀说:“嘿,小哆啦,这题有点意思吧,我看好你哟,先试试呗。” 小哆啦听了,信心更足了,立马开始在代码编辑器上敲敲打打。

初次冲锋:误陷迷雾

小哆啦看着题目,脑袋里突然想到之前做过的查找子串的问题。他心里琢磨着:“查找子串和判断子序列有点相似嘛,我就用查找子串的思路来试试!” 于是,他手指在键盘上噼里啪啦一顿操作,很快写出了下面这段代码:

function isSubsequence(s: string, t: string): boolean {
    let i = 0;
    let sLen = s.length;
    let tLen = t.length;
    while (i < (tLen - sLen)) {
        let k = 0;
        let j = i;
        while (t[j] == s[k]) {
            j++;
            k++;
            if (k == sLen - 1) {
                return true;
            } 
        }
        i++;
    }
    return false
};

小哆啦看着屏幕上的代码,感觉自己就像一位即将出征的将军,这段代码就是他的无敌战舰。他得意地对小智说:“看我的,我用查找子串的方法来解这题,这题马上就被我拿下!”

然而,当小哆啦运行代码进行测试时,结果却惨不忍睹。就像战舰刚出海就撞上了暗礁,代码给出了一堆错误的判断。小哆啦皱着眉头,眼神里满是疑惑和不解。

小智在一旁笑着说:“小哆啦,别着急,你这是把查找子串和判断子序列搞混啦。查找子串要求字符是连续的,可子序列不要求连续,只要保持相对顺序就行。你这个 while (i < (tLen - sLen)) 限制得太死,好多可能的匹配情况都被你漏掉啦。而且内层循环里,一遇到不相等的字符就放弃当前尝试,这哪行啊,就像寻宝的时候,遇到一点小障碍就回头,宝藏怎么可能找到嘛。”

沉思顿悟:拨云见日

听了小智的话,小哆啦耷拉着脑袋,开始认真反思。他双手抱臂,眼睛紧紧盯着代码,嘴里还念念有词。突然,他眼睛一亮,像是想到了什么。

小智在旁边鼓励道:“哟,看你这眼神,是不是有灵感啦?快说说。”

小哆啦兴奋地说:“我明白了,这题不能用查找子串的思路。我们可以用两个指针,一个指 s,一个指 t,同步着走,这样简单又直接!”

说着,小哆啦重新敲出了下面这段代码:

function isSubsequence(s: string, t: string): boolean {
    let i = 0; 
    let j = 0; 

    while (i < s.length && j < t.length) {
        if (s[i] === t[j]) {
            i++;
        }
        j++;
    }

    return i === s.length;
}

小哆啦写完后,自信满满地对小智说:“你看,现在我就像一个聪明的猎人,顺着猎物留下的线索一步步追踪。只要在 t 里找到了 s 的字符,就把 s 的指针往后移,一直追下去。最后看看 s 的指针是不是走完了,走完了就说明 st 的子序列。”

胜利欢呼:荣耀时刻

小哆啦怀着紧张又期待的心情运行了新代码。当看到所有的测试用例都通过时,他兴奋得一蹦三尺高,像个小孩子得到了心爱的玩具。

小智也在一旁鼓掌,笑着说:“小哆啦,你真棒!这就是编程的魅力,遇到问题别慌,冷静思考,换个思路就能柳暗花明。以后啊,这样的挑战都难不倒你啦!”

小哆啦开心地说:“多亏了你的引导,小智。我以后会更细心,遇到问题多换角度思考。现在我又充满能量,准备迎接下一个编程挑战啦!”

从此,小哆啦在编程的道路上又多了一份经验和智慧,向着成为顶级编程大师的目标继续勇敢前行。