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

需求

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

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

思路1

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

  2. 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

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

  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

思路三

  1. Cyclomatic Complexity循环复杂度

  2. 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^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
社会的进步导致人们对于学习的追求永不止境,那么追求农业信息化的方式也从单一的田地教程变成了多样化的学习方式。多样化的学习方式不仅仅是需要人们智慧的依靠,还需要能够通过软件的加持进行信息化的价值体现。软件和系统的产生,从表面上来看是方便了某一行业和某一行业的用户,其实是从本质上来说是提高了社会的进步。就拿我们常见的出行而言,滴滴出行看似是为了打车和出行的人方便,但其实通过另外一种程度上来说,可以通过软件应用的调度和发展来为社会、城市出行的发展做出巨大的贡献。我们国家从最早的中国制造业演变到现在的“智造”,就是因为有软件信息系统的价值,能够将一些智慧的因素加入到制造的过程当中,而这一点就是软件系统来改变生产和现实的需求。在计算机时代日益发展的今天,计算机网络正快速融入这个社会的每一个领域。农业的发展是社会当中一种必有可少的方式。果树在种植和培养是直接影响果农及果商的发展,但在果树的资源管理方面还是有着很大的不同,所以信息多样化的果树管理方式很重要。在传统的果树资源管理上还有着很大的约束,为此开发和设计JSP杏种质资源管理系统,该系统内容丰富多彩,用户可以在线进行果杏树的资源查询等。本文还是使用JSP的方式来进行管理的,但在系统建设过程当中也考虑了许许多多信息安全的保护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值