小哆啦解题记:字符串子序列大冒险
小哆啦开始刷力扣的第二十一天
神秘任务降临
在代码王国里,小哆啦一直是个热爱挑战的编程小能手。这天,神秘的编程精灵给小哆啦发布了一个任务:判断字符串 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 的指针是不是走完了,走完了就说明 s 是 t 的子序列。”
胜利欢呼:荣耀时刻
小哆啦怀着紧张又期待的心情运行了新代码。当看到所有的测试用例都通过时,他兴奋得一蹦三尺高,像个小孩子得到了心爱的玩具。
小智也在一旁鼓掌,笑着说:“小哆啦,你真棒!这就是编程的魅力,遇到问题别慌,冷静思考,换个思路就能柳暗花明。以后啊,这样的挑战都难不倒你啦!”
小哆啦开心地说:“多亏了你的引导,小智。我以后会更细心,遇到问题多换角度思考。现在我又充满能量,准备迎接下一个编程挑战啦!”
从此,小哆啦在编程的道路上又多了一份经验和智慧,向着成为顶级编程大师的目标继续勇敢前行。