資料結構與演算法: 迴文

20.01.08

Photo by Kelly Sikkema on Unsplash

請完成一個 function:參數為 string,請判斷該字串正著看和反著看,可否是相同的單詞?是的話請回傳 true, 否則回傳 false。

例: palindrome(“abba”) === true palindrome(“16461”) === true palindrome(“abcdefg”) === false

function palindrome(str) {

}

這個問題要搭配上一節的字串反轉一起看,若還沒看過的請詳見上一節。

方法一、

1.要熟悉字串反轉的不同方式

// 字串反轉
function reversed(str) {
  let reversedStr = ""
  for (let char of str) {
    reversedStr = `${char}${reversedStr}`
  }
  return reversedStr
}

function palindrome(str) {
  return str === reversed(str) ? true : false
}

方法一為相當正規的方式,不論用什麼方式將字串反轉,只要反轉前後相等,皆為正解。

方法二、

思考邏輯

1.第一個字元跟最後一個字元比較,第二個字元跟倒數第二個字元比較,以此類推 2.知道 Array.prototype.every()。可檢查陣列中的每一個項目是否符合條件,回傳值僅為 true or false,很適合用來檢查陣列中的內容是否符合特定條件。

這個方法有個缺點:當檢查到陣列的中點時,理論上不必再繼續往下檢查了,因為後面的項目都已跟前面的項目比較過。 但 every()會遍歷陣列中的每一個項目,直到最後一個。

儘管如此,白板題就是一種火力展示,一個題目你會兩種以上的解法,絕對是多多益善。 況且 第一個字元跟最後一個字元比較,第二個字元跟倒數第二個字元比較 這種思考邏輯,在更進階的題目會經常使用。

function palindrome(str) {
  let arr = str.split("")
  let bool = arr.every((char, index) => {
    return char === arr[arr.length - (index + 1)]
  })
  return bool
}

更精簡的 code 如下:

function palindrome(str) {
  return str
    .split("")
    .every((char, index) => char === str[str.length - (index + 1)])
}

以下是本章節的程式碼: