[
math
string
palindrome
]
Leetcode 0564 Find the Closest Palindrome
Problem statement
https://leetcode.com/problems/find-the-closest-palindrome/
Solution
First of all, there is not more than 5 candidates we need to consider for number n. Let us cut first half and denote this number by half. For example for 1234567 it will be 1234 and for 123456 it will be 123. Then we need to consider numbers half - 1, half, half + 1 and reconstruct palindromes from them: I use two functions: Co(q) and Ce(q). Also we need to consider numbers 99...99 and 100...001.
Complexity
Overall time and space complexity is O(k), where k is length of number n.
Code
class Solution:
def nearestPalindromic(self, n):
def Co(q): return int(str(q) + str(q)[::-1])
def Ce(q): return int(str(q) + str(q)[:-1][::-1])
k = len(n)
if k % 2 == 0:
half = int(n[:k//2])
c1, c2, c3 = Co(half), Co(half-1), Co(half+1)
else:
half = int(n[:k//2+1])
c1, c2, c3 = Ce(half), Ce(half-1), Ce(half+1)
cands = set([10**k+1, 10**(k-1)-1]) | set([c1, c2, c3])
cands.discard(int(n))
return str(min(cands, key = lambda x: [abs(x-int(n)), x]))