力扣之有效的迴文

水冗水孚發表於2022-07-03

題目描述

給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。

說明: 本題中,我們將空字串定義為有效的迴文串。

示例 1:

輸入: "A man, a plan, a canal: Panama"
輸出: true
解釋:"amanaplanacanalpanama" 是迴文串

示例 2:

輸入: "race a car"
輸出: false
解釋:"raceacar" 不是迴文串
力扣原題目地址:https://leetcode.cn/problems/...

解決方案

方案一 判斷第i項和第j項是否相等(i+j==s.length-1)

下方程式碼中,我就不區分ij了,直接是i(filterS.length - 1) - i

var isPalindrome = function (s) {
    let flag = true
    // 先加工資料,替換去掉空格特殊符號,以及轉成小寫英文統一對比
    let filterS = s.replace(/[^A-Za-z0-9]/g, '').toLocaleLowerCase()
    for (let i = 0; i < filterS.length; i++) {
        // 如果有其中一項不符合規則,就直接結束迴圈,返回結果即可
        if (filterS[i] != filterS[filterS.length - 1 - i]) {
            flag = false
            return flag
        }
    }
    // 最後再返回一下,因為有可能就是迴文數,要返回true
    return flag
};

注意,程式碼中的迴圈,其實不用迴圈所有項,只需要迴圈一半就行了,所以上述程式碼也可以換一下寫法:
for (let i = 0; i < Math.trunc(filterS.length / 2); i++) {......}

注意冷門api之Math.trunc()是取整的意思

  • Math.trunc(2.5) // 2
  • Math.trunc(3) // 3
使用Math.trunc()只迴圈一半雖然消耗記憶體少了一些,但是所花費的時間會多一些了,因為Math公式也會花費時間的

方案二 字串轉陣列反轉對比

var isPalindrome = function (s) {
    // 先加工資料,去掉空格特殊符號,以及轉成小寫英文統一對比
    let filterS = s.replace(/[^A-Za-z0-9]/g, '').toLocaleLowerCase()
    let filterSArr = filterS.split('') // 轉成正常順序陣列
    let filterSArrReverse = filterS.split('').reverse() // 轉成倒敘順序陣列
    if (JSON.stringify(filterSArr) == JSON.stringify(filterSArrReverse)) { // 比較是否相等
        return true
    } else {
        return false
    }
};

這方法雖然也能實現,但是效能卻是沒有方案一好,因為陣列的方法反轉、以及JSON序列化本身也是要耗費時間的

總結

正常情況下,我們使用空間換時間,多耗費一點點記憶體,但是時間提速一些,還是划算的。所以方案一是首選

另附正則,只能輸入中英文數字 str = str.replace(/[^\u4E00-\u9FA5A-Za-z0-9]/g, '')

相關文章