如果一個(gè)字符串忽略標(biāo)點(diǎn)符號、大小寫和空格,正著讀和反著讀一模一樣,那么這個(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.
最新版簡潔的方法更新在最下面
首先,去掉字符串中的標(biāo)點(diǎn)符號和空白格。可以用str.replace()+正則表達(dá)式匹配。
var newStr = str.replace(/[\ |\~|\
|!|@|#|$|%|^|&|*|(|)|-|_|+|=|||\|[|]|{|}|;|:|"|'|,|<|.|>|/|?]/g,""); `
這個(gè)比較狠,幾乎把所有的標(biāo)點(diǎn)符號都去掉了。
接下來我們看看"0_0 (: /-\ :) 0-0"經(jīng)過加工會變成什么。
0000
漂亮,去掉了標(biāo)點(diǎn)符號和空格。
接下來還要大小寫轉(zhuǎn)換,回文的話是不區(qū)分大小寫的,所以我們要把所有的字符全都換成小寫(或者大寫);
沒錯(cuò),用str.toLowerCase();
var newNewStr = newStr.toLowerCase();
經(jīng)過兩次加工,"A man, a plan, a canal. Panama"
變成了
amanaplanacanalpanama
接下來,把字符串轉(zhuǎn)換成數(shù)組。可以用str.split("")
var spl = newNewStr.split("");
這時(shí)候"eye"就變成了
["e","y","e"]
接下來,旋轉(zhuǎn)跳躍,反轉(zhuǎn)數(shù)組。
var newSpl = spl.reverse();
["e","y","e"]依然還是["e","y","e"]。
但是如果說是["e","y","a"],則會變成
["a","y","e"]
這里要注意,在javascript中,數(shù)組是沒有辦法比較的,所以要把它再轉(zhuǎn)為字符串。
var newRel = newSpl.join("");
這樣就得到了反轉(zhuǎn)之后的字符串。
可以開始比較啦。
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日更新
更簡潔的算法
省去了一些臨時(shí)變量,直接比較輸出。其實(shí) newStr
也可以省去,會更簡潔一點(diǎn),不過這樣代碼的可讀性會大大降低。。
function palindrome(str) {
var newStr = str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,"");
return str == newStr.toLowerCase().split("").reverse().join("");
}
(可能是)最終版更新
由于這個(gè)代碼是我初學(xué)JS的時(shí)候?qū)懙模浅2怀墒欤兄x評論區(qū)@S1ngS1ng指出的方法。非常簡潔
function palindrome(str) {
// 轉(zhuǎn)換成小寫用正則過濾掉符號
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");