js 判斷迴文字符串

迴文( Palindromes ),在中文文當中是指倒着念和順着念都是相同的,先後對稱,例如「上海自來水來自海上」;在英文文當中是指正着看和反着看都相同的單詞,例如「madam」;而對於數字,又稱之爲迴文數,是指一個像「16461」這樣的對稱的數,即這個數的數字按相反的順序從新排列後獲得的數和原來的數同樣。git

問題描述

判斷給定的字符串,若是字符串是一個Palindromes,那麼返回true,反之返回falsegithub

實現方法

1. reverse()

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 對比
}

實際上這裏作了不少步對數組的操做,字符轉數組 翻轉數組 再轉字符串,因此這裏性能也不是很好。覺得數組是引用類型,要改變這個數組,須要開闢新的堆地址空間。數組

2. for 循環

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;
}

3. 遞歸

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')

references

判斷字符迴文遞歸

相關文章
相關標籤/搜索