需求
给出一个字符串,检测是否是回文,是则返回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
思路三
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^
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。