资讯专栏INFORMATION COLUMN

【译】JS基础算法脚本:回文检测

Turbo / 3139人阅读

摘要:返回一个新的字符串,表示串转换为小写的调用字符。不会影响字符串本身的值。返回一个包含子字符的数组,确定分割位置。将数组中所有子元素拼接成一个字符串,不改变原数组。

需求

给出一个字符串,检测是否是回文,是则返回true,不是则返回false(忽略标点符号,大小写,空格)

palindrome("A man, a plan, a canal. Panama") should return true.
palindrome("five|\_/|four")
思路1

返回一个忽略标点,空格,小写的新字符串

for-if 来检测前后索引字符是否相等

function palindrome(str) {
    str = str.replace(/[W_]/g,"").toLowerCase();
    for(var i = 0,len = str.length -1 ; i < str.length/2; i++) {
        if(str[i] !== str[len-i]) {
            return false;
        }
    }
    
    return true;
}

palindrome("almostomla");
palindrome("five|\_/|four");
palindrome("_eye");
//0.1279296875ms
思路2

得到新的反转字符串,忽略标点符号,空格,大小写

比较新旧字符串

function palindrome(str) {
    return str.replace(/[W_]/g,"").toLowerCase() ===
           str.replace(/[W_]/g,"").toLowerCase().split("").reverse().join("");
}

palindrome("almostomla");
palindrome("five|\_/|four");
palindrome("_eye");
//0.001953125ms
思路三

Cyclomatic Complexity循环复杂度

Divide and Conquer分治算法

function palindrome(str) {
  let front = 0;
  let back = str.length - 1; //match匹配是按索引查找的,所以要-1

  while (back > front) { //避免重复
    //从前往后查找符合条件的字符
    while ( str[front].match(/[W_]/) ) {
      front++;
      continue;
    }
    //从后往前查找符合条件的字符
    while ( str[back].match(/[W_]/) ) {
      back--;
      continue;
    }
    //忽略大小写,比较前后字符
    if ( str[front].toLowerCase() !== str[back].toLowerCase() ) {
        return false
    };
    //继续循环
    front++;
    back--;
  }
  
  return true;
}
palindrome("almostomla");
palindrome("five|\_/|four");
palindrome("_eye");
// 0.19580078125ms
相关:
str.replace(regexp|substr, newSubstr|function)

replace() 方法返回一个由newSubstr|function替换substr|regexp的新字符串。该方法并不改变调用它的字符串本身,而只是返回一个新的替换后的字符串。

str.toLowerCase()

返回一个新的字符串,表示串转换为小写的调用字符。toLowerCase 不会影响字符串本身的值。

str.split([separator[, limit]])

返回一个包含子字符的数组,separator确定分割位置。不影响原字符串。

arr.join(separator)

将数组中所有子元素拼接成一个字符串,不改变原数组。separator,默认为","

正则表达式

有其他好的方法或思路的道友,不妨在沙发区神交一番。
思路三,有人说他是最好的方案,为什么速度并不快
以及分而治之的思想,复杂度问题,哪位大牛交流下体会^q^

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84673.html

相关文章

  • JS基础算法脚本:验证字符包含关系

    摘要:需求给出一个包含两个字符串的数组。方法用于判断一个字符串是否包含在另一个字符串中,根据情况返回或。方法为数组中的每个元素执行一次函数,直到它找到一个使返回表示可转换为布尔值的值的元素。有其他好的方法或思路的道友,不妨在沙发区神交一番。 需求 给出一个包含两个字符串的数组。验证第二个字符的子字符全被第一个字符包含(忽略大小写)是则返回true;否则返回false mutation([he...

    isaced 评论0 收藏0
  • 16道初级脚本算法,你要挑战一下吗?

    摘要:设置首字母大写算法挑战返回一个字符串确保字符串的每个单词首字母都大写,其余部分小写。确认末尾字符算法检查一个字符串是否以指定的字符串结尾。删除数组中特定值算法挑战删除数组中的所有的假值。 在w3cschool上看到了这些初级算法题目,自己先尝试做了一下,不会的也会查看一下别人的借鉴一下思路,更多的帮助自己熟悉字符串和数组方法的应用.如果您有更好的解法,可以指出来还有中级算法题目和后面的...

    kumfo 评论0 收藏0
  • W3Cschool——初级脚本算法

    摘要:方法二提供者沐辰楼姬采用对象的方法取值优化内部循环性能确认末尾字符算法挑战检查一个字符串是否以指定的字符串结尾。方法一方法二提供者沐辰楼姬使用数组对象方法,把数组的第一个元素从其中删除,并返回第一个元素的值。 showImg(https://segmentfault.com/img/remote/1460000009702368?w=1269&h=541); 前言 偶然看到W3Csch...

    mayaohua 评论0 收藏0
  • W3Cschool——初级脚本算法

    摘要:方法二提供者沐辰楼姬采用对象的方法取值优化内部循环性能确认末尾字符算法挑战检查一个字符串是否以指定的字符串结尾。方法一方法二提供者沐辰楼姬使用数组对象方法,把数组的第一个元素从其中删除,并返回第一个元素的值。 showImg(https://segmentfault.com/img/remote/1460000009702368?w=1269&h=541); 前言 偶然看到W3Csch...

    CntChen 评论0 收藏0
  • 长知识 - 收藏集 - 掘金

    摘要:问题是这些服务都是第三方提供的,不能保证它们的响应时间,快的话美团点评分布式生成系统后端掘金背景在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。 SpringBatch 读取 txt 文件并写入数据库 - 后端 - 掘金SpringBatch 读取 txt 文件并写入数据库... Java 进阶-多线程开发关键技术 - 后端 - 掘金原创文章,转载请务必将下面这段话置于文章...

    SimpleTriangle 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<