js 判斷回文字符串

回文( Palindromes ),在中文文當中是指倒著念和順著念都是相同的,前后對稱,例如“上海自來水來自海上”;在英文文當中是指正著看和反著看都相同的單詞,例如“madam”;而對于數字,又稱之為回文數,是指一個像“16461”這樣的對稱的數,即這個數的數字按相反的順序重新排列后得到的數和原來的數一樣。

問題描述

判斷給定的字符串,如果字符串是一個Palindromes,那么返回true,反之返回false

實現方法

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,當第一次發現兩邊這一對字符不同時,可繼續進行對比; 之后的對比中若發現不同,立即返回結果。

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

判斷字符回文

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 我愿做一棵樹,屹立在你必經的路上。我愿做一片云,替你抵擋烈日。我愿做一把傘,經受暴風驟雨。這就是愛情。 于千萬人之...
    代我閱讀 249評論 0 0
  • 解讀對象:kikis & 稀飯 解讀文章:《網紅、主播、個人IP、移動直播……這一切的鏈條式解讀》 別人分析得好的...
    喵媽愛小魚閱讀 354評論 0 0
  • 重慶大學重慶校友讀書會 “讀書、分享、踐行、成長” -------------------------------...
    路叔叔閱讀 2,131評論 0 2