如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
如果给定的字符串是回文,返回true,反之,返回false。
比如
palindrome("eye")应该返回 true.
palindrome("race car")应该返回 true.
palindrome("A man, a plan, a canal. Panama")应该返回 true.
palindrome("1 eye for of 1 eye.")应该返回 false.
palindrome("0_0 (: /-\ :) 0-0")应该返回 true.
最新版简洁的方法更新在最下面
首先,去掉字符串中的标点符号和空白格。可以用str.replace()+正则表达式匹配。
var newStr = str.replace(/[\ |\~|\
|!|@|#|$|%|^|&|*|(|)|-|_|+|=|||\|[|]|{|}|;|:|"|'|,|<|.|>|/|?]/g,""); `
这个比较狠,几乎把所有的标点符号都去掉了。
接下来我们看看"0_0 (: /-\ :) 0-0"经过加工会变成什么。
0000
漂亮,去掉了标点符号和空格。
接下来还要大小写转换,回文的话是不区分大小写的,所以我们要把所有的字符全都换成小写(或者大写);
没错,用str.toLowerCase();
var newNewStr = newStr.toLowerCase();
经过两次加工,"A man, a plan, a canal. Panama"
变成了
amanaplanacanalpanama
接下来,把字符串转换成数组。可以用str.split("")
var spl = newNewStr.split("");
这时候"eye"就变成了
["e","y","e"]
接下来,旋转跳跃,反转数组。
var newSpl = spl.reverse();
["e","y","e"]依然还是["e","y","e"]。
但是如果说是["e","y","a"],则会变成
["a","y","e"]
这里要注意,在javascript中,数组是没有办法比较的,所以要把它再转为字符串。
var newRel = newSpl.join("");
这样就得到了反转之后的字符串。
可以开始比较啦。
if (newNewStr == newRel) {
return true;
} else return false;
成功,完整代码如下
function palindrome(str) {
var newStr = str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,"");
var newNewStr = newStr.toLowerCase();
var spl = newNewStr.split("");
var newSpl = spl.reverse();
var newRel = newSpl.join("");
if (newNewStr == newRel) {
return true;
} else return false;
}
palindrome("0_0 (: /-\ :) 0-0");
10月26日更新
更简洁的算法
省去了一些临时变量,直接比较输出。其实 newStr
也可以省去,会更简洁一点,不过这样代码的可读性会大大降低。。
function palindrome(str) {
var newStr = str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,"");
return str == newStr.toLowerCase().split("").reverse().join("");
}
(可能是)最终版更新
由于这个代码是我初学JS的时候写的,非常不成熟,感谢评论区@S1ngS1ng指出的方法。非常简洁
function palindrome(str) {
// 转换成小写用正则过滤掉符号
var nStr = str.toLowerCase().replace(/[^a-z0-9]/g,"");
//验证反转后是否相等
return nStr.split("").reverse().join("") === nStr;
}
palindrome("A man, a plan, a canal. Panama");