此系列筆記主要依照 [Udemy] Learning Algorithms in JavaScript from Scratch by Eric Traub 的課程脈絡加以整理,但部分程式碼是消化後以自己較易理解的方式重新撰寫,因此和原課程內容有些出入。
問題描述
在忽略單字大小寫和標點符號的情況下,判斷字串是不是迴文(palindrome),也就是順著寫和逆著寫都是一樣的,例如,Madam, I'm Adam, race car。
function isPalindrome (str) {
// return true or false
}
isPalindrome("Madam, I'm Adam") // true
演算法實做
步驟一:將所有的單字轉成小寫,拆成陣列,並且排除非英文單字
我們先透過 String.toLowerCase() 將字串的內容全部轉成小寫,接著透過 String.split() 將字串拆成陣列,最後透過 Array.filter() 搭配一些正規表達式 /[a-z]/ 只保留小寫的英文字母,其他都過濾掉:
function isPalindrome (str) {
// 將所有的單字轉成小寫,拆成陣列,並且排除非英文單字
str = str.toLowerCase()
charactersArr = str.split('').filter(character => {
return /[a-z]/.test(character)
})
/* ... */
}
步驟二:如果正著寫和逆著寫都一樣,則回傳 true,否則 false
透過 Array.join() 將原本的陣列重新合併為字串。利用 Array.reverse() 將陣列反轉([a, b, c] --> [c, b, a]):
function isPalindrome (str) {
// 將所有的單字轉成小寫,拆成陣列,並且排除非英文單字
/* ... */
// 如果正著寫和反轉過來寫的內容都一樣,則回傳 true,否則 false
return charactersArr.join('') === charactersArr.reverse().join('')
}
完整程式碼
function isPalindrome (str) {
// 將所有的單字轉成小寫,拆成陣列,並且排除非英文單字
str = str.toLowerCase()
charactersArr = str.split('').filter(character => {
return /[a-z]/.test(character)
})
// 如果正著寫和反轉過來寫的內容都一樣,則回傳 true,否則 false
return charactersArr.join('') === charactersArr.reverse().join('')
}
console.log(isPalindrome("Madam, I'm Adam")) // true
console.log(isPalindrome("Hello, I'm Adam")) // false
0 意見:
張貼留言