迴文( Palindromes ),在中文文當中是指倒着念和順着念都是相同的,先後對稱,例如「上海自來水來自海上」;在英文文當中是指正着看和反着看都相同的單詞,例如「madam」;而對於數字,又稱之爲迴文數,是指一個像「16461」這樣的對稱的數,即這個數的數字按相反的順序從新排列後獲得的數和原來的數同樣。git
判斷給定的字符串,若是字符串是一個Palindromes,那麼返回true
,反之返回false
。github
function Palindromes(str) { let reg = /[\W_]/g; // \w 匹配全部字母和數字以及下劃線; \W與之相反; [\W_] 表示匹配下劃線或者全部非字母非數字中的任意一個;/g全局匹配 let newStr = str.replace(reg, '').toLowerCase(); let reverseStr = newStr.split('').reverse().join('') return reverseStr === newStr; // 與 newStr 對比 }
實際上這裏作了不少步對數組的操做,字符轉數組 翻轉數組 再轉字符串,因此這裏性能也不是很好。覺得數組是引用類型,要改變這個數組,須要開闢新的堆地址空間。數組
function Palindromes(str) { let reg = /[\W_]/g; let newStr = str.replace(reg, '').toLowerCase(); for(let i = 0, len = Math.floor(newStr.length / 2); i < len; i++) { if(newStr[i] !== newStr[newStr.length - 1 - i]) return false; } return true; }
function Palindromes(str) { let reg = /[\W_]/g; let newStr = str.replace(reg, '').toLowerCase(); let len = newStr.length; for(let i = 0, j = len - 1; i < j; i++, j--) { // i < j console.log('---'); if(newStr[i] !== newStr[j]) return false; } return true; }
function palin(str) { let reg = /[\W_]/g; let newStr = str.replace(reg, '').toLowerCase(); let len = newStr.length; while(len >= 1) { console.log('--') if(newStr[0] != newStr[len - 1]) { // len = 0; // 爲了終止 while 循環 不然會陷入死循環 return false; } else { return palin(newStr.slice(1, len - 1)); // 截掉收尾字符 再次比較收尾字符是否相等 // 直到字符串剩下一個字符(奇數項)或者 0 個字符(偶數項) } } return true; }
對於給定的字符串,最多能夠刪除一個字符,判斷它是否仍是不是迴文。性能
設置一個變量 flag,當第一次發現兩邊這一對字符不一樣時,可繼續進行對比; 以後的對比中若發現不一樣,當即返回結果。code
function palin(str) { let flag = false; // 第一次不一樣可容許 let len = str.length; for(let [i, j] = [0, len - 1]; i < j; i++, j--) { if(str[i] !== str[j]) { if(flag) { return false; } // 第一次發現不一樣時,讓右邊-1 或左邊+1判斷相不相等 // 這時候若相等可繼續 不然直接返回結果 false if(str[i++] == str[j]) { i++; flag = true; } else if (str[i] == str[j--]) { j--; flag = true; } else { return false; } } } return true; } palin('abaacaaa'); palin('aabsdjdbaa'); palin('ab')
判斷字符迴文遞歸