math
]
Leetcode 0906. Super Palindromes
Problem statement
https://leetcode.com/problems/super-palindromes/
Solution
It this problem we can use the fact, that number of super palindromes is not very big one. If we have superpalindrome X
, then by definition X = Y*Y
, where Y
is also palindrome. Note also, that palindrome is defined by the first half Z
of its digits, so if we consider all Z
in region [1, W^0.25]
it will be enough. Indeed, let us consider all Z
in region [1, 10^5)
, it will be enough: in this case Y
will be in range [1, 10^9)
and X will be in range [1, 10^18)
.
So, what I did here is just precompute all palindromes and then use binary search to calculate number of them.
Complexity
Time complexity is O(W^0.25 * log W)
, where W = 10^18
is the upper limit. Here we have log W
factor, because for each candidate we transfrom it to string and also becauswe we use sort in the end. Space complexity is O(W^0.25)
. Note also that in practice this will work quite fast, because we evaluate nums
outside function, so it will be calculated only once.
from bisect import bisect
class Solution:
nums = []
for i in range(1, 100000):
cand1 = int(str(i) + str(i)[::-1])**2
cand2 = int(str(i)[:-1] + str(i)[::-1])**2
if str(cand1) == str(cand1)[::-1]: nums += [cand1]
if str(cand2) == str(cand2)[::-1]: nums += [cand2]
nums = sorted(list(set(nums)))
def superpalindromesInRange(self, L, R):
return bisect(self.nums, int(R)) - bisect(self.nums, int(L)-1)