題目描述
給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。
說明: 本題中,我們將空字串定義為有效的迴文串。
示例 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)
下方程式碼中,我就不區分i
和j
了,直接是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, '')