這個問題很簡單,如果字串是回文(或為空),則回傳 true。如果從字串中的一個索引中洗掉一個字母使其成為回文,則回傳 true。否則回傳假。
我的代碼,我相信它有效:
const isQuasiPalindrome = str => {
if(!str || str.length < 2) return true
const chars = str.split('')
return isQuasiPalindromeWorker(chars, false)
}
const isQuasiPalindromeWorker = (chars, isRemoved) => {
if(chars.length === 0) return false
for(i = 0, j = chars.length - 1; i < j; i , j--) {
if(chars[i] !== chars[j]) {
if(isRemoved) return false
const left = chars.filter((_,k) => k !== i)
const right = chars.filter((_,l) => l !== j)
return isQuasiPalindromeWorker(left, true)
|| isQuasiPalindromeWorker(right, true)
}
}
return true
}
(有一個更好的答案,它對空間的要求更少)
現在,這就是我在 5-10 分鐘后得到的結果:
const isQuasiPalindrome = str => {
if(!str || str.length < 2) return true
const chars = str.split('')
return isQuasiPalindromeWorker(chars, false)
}
const isQuasiPalindromeWorker = (chars, isRemoved) => {
if(chars.length === 0) return false
for(i = 0, j = chars.length - 1; i < j; i , j--) {
if(chars[i] !== chars[j]) {
if(isRemoved) return false
return isQuasiPalindromeWorker(chars.filter((_,k) => k !== i)
, true)
|| isQuasiPalindromeWorker(chars.filter((_,l) => l !== j)
, true)
}
}
return true
}
由于某種原因,該版本不起作用。為什么它不起作用?
這是一個帶有控制臺日志的版本,可幫助演示它是如何失敗的:
const isQuasiPalindrome = str => {
const chars = str.split('')
return isQuasiPalindromeWorker(chars, false)
}
const isQuasiPalindromeWorker = (chars, isRemoved) => {
console.log('chars', chars)
if(chars.length === 0) return false
for( i = 0, j = chars.length - 1; i < j; i , j-- ) {
console.log(i,j)
if(chars[i] !== chars[j]) {
if(isRemoved) return false
console.log(chars.filter((_,l) => l !== i), chars.filter((_,l) => l !== j))
return isQuasiPalindromeWorker(chars.filter((_,k) => k !== i), true) || isQuasiPalindromeWorker(chars.filter((_,l) => l !== j), true)
}
}
return true
}
樣本結果:
isQuasiPalindrome('racecars')
chars
Array(8) [ "r", "a", "c", "e", "c", "a", "r", "s" ]
debugger eval code:6:11
0 7 debugger eval code:9:13
Array(7) [ "a", "c", "e", "c", "a", "r", "s" ]
Array(7) [ "r", "a", "c", "e", "c", "a", "r" ]
debugger eval code:12:15
chars
Array(7) [ "a", "c", "e", "c", "a", "r", "s" ]
debugger eval code:6:11
0 6 debugger eval code:9:13
chars
Array(7) [ "r", "a", "c", "e", "c", "a", "s" ]
debugger eval code:6:11
0 6 debugger eval code:9:13
false
我的原始版本只保存了 2 行代碼,并且絕對使它不那么清晰。但是我浪費了很多時間來弄清楚為什么我的代碼在這里失敗了,坦率地說,我知道它是如何失敗的,但仍然不知道為什么。
uj5u.com熱心網友回復:
const isQuasiPalindrome = str => {
if(!str || str.length < 2) return true
const chars = str.split('')
return isQuasiPalindromeWorker(chars, false)
}
const isQuasiPalindromeWorker = (chars, isRemoved) => {
if(chars.length === 0) return false
for(let i = 0, j = chars.length - 1; i < j; i , j--) {
if(chars[i] !== chars[j]) {
if(isRemoved) return false
return isQuasiPalindromeWorker(chars.filter((_,k) => k !== i)
, true)
|| isQuasiPalindromeWorker(chars.filter((_,l) => l !== j)
, true)
}
}
return true
}
我通過let在 for 回圈中添加關鍵字來編輯失敗的代碼片段。這應該回傳true.racecars
沒有let關鍵字, i 和 j 被隱式宣告為全域變數。一旦isisQuasiPalindromeWorker運行,到
chars.filter((_,l) => l !== j執行時,j其值已被覆寫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464069.html
標籤:javascript
上一篇:根據選擇顯示或隱藏div
