给出一个字符串,检测是不是回文,是则返回true,不是则返回false(忽略标点符号,大小写,空格)正则表达式
palindrome("A man, a plan, a canal. Panama") should return true. palindrome("five|\_/|four")
返回一个忽略标点,空格,小写的新字符串算法
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
获得新的反转字符串,忽略标点符号,空格,大小写ide
比较新旧字符串code
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循环复杂度regexp
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的新字符串。该方法并不改变调用它的字符串自己,而只是返回一个新的替换后的字符串。ip
str.toLowerCase()
返回一个新的字符串,表示串转换为小写的调用字符。toLowerCase 不会影响字符串自己的值。字符串
str.split([separator[, limit]])
返回一个包含子字符的数组,separator肯定分割位置。不影响原字符串。get
arr.join(separator)
将数组中全部子元素拼接成一个字符串,不改变原数组。separator,默认为","
有其余好的方法或思路的道友,不妨在沙发区神交一番。
思路三,有人说他是最好的方案,为何速度并不快
以及分而治之的思想,复杂度问题,哪位大牛交流下体会^q^