如果一個(gè)字符串忽略標(biāo)點(diǎn)符號(hào)撒汉、大小寫和空格,正著讀和反著讀一模一樣涕滋,那么這個(gè)字符串就是palindrome(回文)睬辐。
如果給定的字符串是回文,返回true,反之溯饵,返回false侵俗。
比如
palindrome("eye")應(yīng)該返回 true.
palindrome("race car")應(yīng)該返回 true.
palindrome("A man, a plan, a canal. Panama")應(yīng)該返回 true.
palindrome("1 eye for of 1 eye.")應(yīng)該返回 false.
palindrome("0_0 (: /-\ :) 0-0")應(yīng)該返回 true.
最新版簡(jiǎn)潔的方法更新在最下面
首先,去掉字符串中的標(biāo)點(diǎn)符號(hào)和空白格丰刊“ィ可以用str.replace()+正則表達(dá)式匹配。
var newStr = str.replace(/[\ |\~|\
|!|@|#|$|%|^|&|*|(|)|-|_|+|=|||\|[|]|{|}|;|:|"|'|,|<|.|>|/|?]/g,""); `
這個(gè)比較狠藻三,幾乎把所有的標(biāo)點(diǎn)符號(hào)都去掉了洪橘。
接下來(lái)我們看看"0_0 (: /-\ :) 0-0"經(jīng)過(guò)加工會(huì)變成什么。
0000
漂亮棵帽,去掉了標(biāo)點(diǎn)符號(hào)和空格熄求。
接下來(lái)還要大小寫轉(zhuǎn)換,回文的話是不區(qū)分大小寫的逗概,所以我們要把所有的字符全都換成小寫(或者大寫)弟晚;
沒(méi)錯(cuò),用str.toLowerCase();
var newNewStr = newStr.toLowerCase();
經(jīng)過(guò)兩次加工逾苫,"A man, a plan, a canal. Panama"
變成了
amanaplanacanalpanama
接下來(lái)卿城,把字符串轉(zhuǎn)換成數(shù)組∏Υ辏可以用str.split("")
var spl = newNewStr.split("");
這時(shí)候"eye"就變成了
["e","y","e"]
接下來(lái)瑟押,旋轉(zhuǎn)跳躍,反轉(zhuǎn)數(shù)組星掰。
var newSpl = spl.reverse();
["e","y","e"]依然還是["e","y","e"]多望。
但是如果說(shuō)是["e","y","a"],則會(huì)變成
["a","y","e"]
這里要注意氢烘,在javascript中怀偷,數(shù)組是沒(méi)有辦法比較的,所以要把它再轉(zhuǎn)為字符串播玖。
var newRel = newSpl.join("");
這樣就得到了反轉(zhuǎn)之后的字符串椎工。
可以開(kāi)始比較啦。
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日更新
更簡(jiǎn)潔的算法
省去了一些臨時(shí)變量维蒙,直接比較輸出。其實(shí) newStr
也可以省去脓斩,會(huì)更簡(jiǎn)潔一點(diǎn)木西,不過(guò)這樣代碼的可讀性會(huì)大大降低。随静。
function palindrome(str) {
var newStr = str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,"");
return str == newStr.toLowerCase().split("").reverse().join("");
}
(可能是)最終版更新
由于這個(gè)代碼是我初學(xué)JS的時(shí)候?qū)懙陌饲В浅2怀墒炻鹧龋兄x評(píng)論區(qū)@S1ngS1ng指出的方法。非常簡(jiǎn)潔
function palindrome(str) {
// 轉(zhuǎn)換成小寫用正則過(guò)濾掉符號(hào)
var nStr = str.toLowerCase().replace(/[^a-z0-9]/g,"");
//驗(yàn)證反轉(zhuǎn)后是否相等
return nStr.split("").reverse().join("") === nStr;
}
palindrome("A man, a plan, a canal. Panama");