Skip to content

Instantly share code, notes, and snippets.

@selfdeceited
Created May 15, 2022 19:49
Show Gist options
  • Save selfdeceited/eb3d4c8a165c8ffce6a95baeb09bae00 to your computer and use it in GitHub Desktop.
Save selfdeceited/eb3d4c8a165c8ffce6a95baeb09bae00 to your computer and use it in GitHub Desktop.
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
const emptyArr = s.split('').fill(0)
var [unevenMap, evenMap] = [[...emptyArr], [...emptyArr]]
const increaseUneven = (index, level) => {
// hack cos NaN === NaN is false
const prev = s[index - level] || NaN
const next = s[index + level] || NaN
return prev === next
}
const increaseEven = (index, level) => {
const prev = s[index - level + 1] || NaN
const next = s[index + level] || NaN
return prev === next
}
const findChampion = m => m
.map((n, i) => ({n, i}))
.sort((a, b) => b.n - a.n)[0] || 0
for (let i = 0; i < s.length; i++) {
var [deepLevel, deepLevelEven] = [1, 1];
while (increaseUneven(i, deepLevel)) {
unevenMap[i] = unevenMap[i] + 1
deepLevel++
}
while (increaseEven(i, deepLevelEven)) {
evenMap[i] = evenMap[i] + 1
deepLevelEven++
}
}
const {i: unevenIndex, n: unevenOffset} = findChampion(unevenMap)
const unevenChampion = s.substr(unevenIndex - unevenOffset, unevenOffset * 2 + 1)
const {i: evenIndex, n: evenOffset} = findChampion(evenMap)
const evenChampion = s.substr(evenIndex - evenOffset + 1, evenOffset * 2)
return unevenChampion.length > evenChampion.length ? unevenChampion : evenChampion
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment