小哆啦解题记:验证回文串

179 阅读6分钟

小哆啦解题记:验证回文串

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

125. 验证回文串 - 力扣(LeetCode)

难题降临,小哆啦陷入困境

在充满奇思妙想与挑战的编程世界里,小哆啦正眉头紧锁,死死地盯着电脑屏幕上那道验证回文串的题目,仿佛要用眼神把它 “吃掉”。这道题就像一个小怪兽,要求小哆啦把字符串里所有大写字母变成小写,还得把那些捣乱的非字母数字字符统统赶跑,然后判断剩下的部分正着读和反着读是不是一模一样。

“这可怎么办呀!” 小哆啦急得抓耳挠腮,嘴里不停地嘟囔着,“这题也太难了吧,我感觉自己就像在黑暗里摸索的小蚂蚁,完全找不到方向。” 就在小哆啦陷入绝望的时候,一道熟悉的身影出现在他身后。原来是编程小达人小智,他满脸笑容,眼睛里透着自信的光芒。

小智登场,初改代码显神通

“小哆啦,又被难题困住啦?别担心,我来帮你!” 小智的声音就像一道光,瞬间照亮了小哆啦心里的黑暗角落。小哆啦眼睛一下子亮了起来,就像抓住了救命稻草一样,连忙把自己写的代码展示给小智看。

function isPalindrome(s: string): boolean {
    let arr = [];
    for(let i=0;i<s.length;i++){
        if(s[i]<='z'&&s[i]>="a" || s[i]<='Z'&& s[i]>="A" || s[i]<='9' && s[i]>='0'){
            arr.push(s[i])
        }
    }
    let str = arr.join("").toLowerCase();
    for(let i=0,j=arr.length-1;i<j;i++,j--){
        if(str[i]!== str[j]){
            return false
        }
    }
    return true
    
};

小智仔细地看了看代码,脸上露出了温和的笑容:“小哆啦,你的思路其实是对的,就是代码有点‘胖’,我们可以帮它减减肥。你看,在筛选字母和数字字符的时候,你写得太麻烦啦。用正则表达式,一下子就能把它们都找出来,就像用一个超级大网把小鱼小虾一网打尽!” 说着,小智就开始动手修改代码。

function isPalindrome(s: string): boolean {
    let arr:string[] = s.match(/[a-zA-Z0-9]/g) || [];
    let str:string = arr.join("").toLowerCase();
    for(let i=0,j=arr.length-1;i<j;i++,j--){
        if(str[i]!== str[j]){
            return false
        }
    }
    return true
};

正则解密,火眼金睛挑字符

“你看,s.match(/[a-zA-Z0-9]/g) 这个表达式就像一个拥有火眼金睛的小侦探,专门负责在字符串里找出所有符合条件的字母和数字。g 这个标志就像是给小侦探下了命令,让它把所有目标都找出来,一个都不放过!要是没找到任何符合条件的字符,它就会返回 null,不过我们用 || [] 这个小技巧,让它乖乖地变成一个空数组,这样就不会出错啦。” 小智耐心地解释着,就像一位经验丰富的老师在给学生上课。

小哆啦听得入了神,眼睛里闪烁着兴奋的光芒,恍然大悟道:“哇,小智你太厉害啦!就像变魔术一样,一下子就把代码变得简洁了。那还能再优化吗?我好想看看还有没有更厉害的方法!”

精简步骤,数组加工更高效

小智笑着点点头:“当然可以啦!你看,你先把数组转成字符串,然后又用数组的长度来做双指针判断,这中间的字符串转换其实有点多余哦。我们可以在提取字符的时候,就直接把它们变成小写,然后直接在数组上做双指针判断,这样就能少走很多弯路啦。”

说完,小智又开始大展身手,手指在键盘上飞快地敲击着,不一会儿,新的代码就出现在屏幕上。

function isPalindrome(s: string): boolean {
    let arr:string[] = s.match(/[a-zA-Z0-9]/g) || [];
    // 显式指定 map 返回数组的类型为 string[]
    arr = arr.map(char => char.toLowerCase()) as string[];
    for (let i = 0, j = arr.length - 1; i < j; i++, j--) {
        if (arr[i]!== arr[j]) {
            return false;
        }
    }
    return true;
}

“这里的 map 函数就像一个神奇的小工厂,它会按照我们设定的规则,把数组里的每个字符都加工一遍。在这里,我们让它把每个字符都转换成小写,然后生产出一个全新的数组。这样一来,就省掉了中间字符串转换的步骤,代码跑起来也更快更高效啦!” 小智详细地讲解着,小哆啦听得津津有味,时不时还提出几个问题,两人讨论得热火朝天。

函数式魔法,every 函数来把关

小哆啦兴奋得手舞足蹈:“太酷啦!这简直就是编程魔法!小智,你快告诉我,还有没有更厉害的优化方法呀?我已经迫不及待想知道啦!”

小智神秘地一笑,故意卖了个关子:“当然有啦!这次,我们要用到函数式编程的方法,让代码变得更加简洁优雅,就像给它穿上了一件华丽的礼服。你看这个 every 函数。”

function isPalindrome(s: string): boolean {
    const matchResult = s.match(/[a-zA-Z0-9]/g);
    let arr: string[] = matchResult ? matchResult.map(char => char.toLowerCase()) : [];
    return arr.every((char, index) => char === arr[arr.length - 1 - index]);
}

“every 函数就像一个严格的小考官,它会对数组里的每一个元素进行检查。在这里,它会检查每个字符和它对称位置的字符是不是一样。如果所有字符都通过了这个严格的检查,它就会返回 true,说明这个字符串是回文串;但只要有一个字符没通过,它就会立刻返回 false。这就是函数式编程的魅力所在,它能让代码变得简洁易懂,还能减少很多潜在的错误,提高代码的可靠性,就像给我们的代码穿上了一层坚固的铠甲!”

小哆啦听得如痴如醉,对小智佩服得五体投地:“小智,你简直就是编程大神!我以后也要像你一样厉害,写出又简洁又高效的代码!”

破茧成蝶,小哆啦逐梦编程路

经过这次和小智的深入学习与探讨,小哆啦成功地解决了验证回文串这个难题。从那以后,小哆啦对编程的热情更加高涨了,他每天都会花大量的时间学习新的编程知识和技巧,不断地提升自己的编程能力。在一次次的挑战与实践中,小哆啦的编程技术逐渐进步,曾经那些让他望而却步的难题,如今也能轻松应对。他就像一只破茧而出的蝴蝶,在编程的广阔天空中自由翱翔,追逐着自己的梦想 。