如果一個字符串忽略標點符號、大小寫和空格,正著讀和反著讀一模一樣,那么這個字符串就是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.
最新版簡潔的方法更新在最下面
首先,去掉字符串中的標點符號和空白格??梢杂胹tr.replace()+正則表達式匹配。
var newStr = str.replace(/[\ |\~|\|!|@|#|$|%|^|&|*|(|)|-|_|+|=|||\|[|]|{|}|;|:|"|'|,|<|.|>|/|?]/g,""); `
這個比較狠,幾乎把所有的標點符號都去掉了。
接下來我們看看"0_0 (: /-\ :) 0-0"經(jīng)過加工會變成什么。
0000
漂亮,去掉了標點符號和空格。
接下來還要大小寫轉換,回文的話是不區(qū)分大小寫的,所以我們要把所有的字符全都換成小寫(或者大寫);
沒錯,用str.toLowerCase();
var newNewStr = newStr.toLowerCase();
經(jīng)過兩次加工,"A man, a plan, a canal. Panama"
變成了
amanaplanacanalpanama
接下來,把字符串轉換成數(shù)組??梢杂胹tr.split("")
var spl = newNewStr.split("");
這時候"eye"就變成了
["e","y","e"]
接下來,旋轉跳躍,反轉數(shù)組。
var newSpl = spl.reverse();
["e","y","e"]依然還是["e","y","e"]。
但是如果說是["e","y","a"],則會變成
["a","y","e"]
這里要注意,在javascript中,數(shù)組是沒有辦法比較的,所以要把它再轉為字符串。
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的時候寫的,非常不成熟,感謝評論區(qū)@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");