解题思路是通过首先生成可能的回文数,然后检查这些回文数的平方是否仍然是回文数。考虑到生成回文数有两种形式:奇数长度和偶数长度的回文数,分别对这两种情况进行生成和检查。对于奇数长度的回文数,形如 'abc' + 'cba'(去掉中心的字符),例如 '123' + '21' = '12321';对于偶数长度的回文数,形式是 'abc' + 'cba',例如 '123' + '321' = '123321'。之后,将生成的回文数平方,并检查是否在给定的范围 [L, R] 内,如果在这个范围内,再检查其平方是否是回文数。
时间复杂度: O(100000)
空间复杂度: O(1)
class Solution:
def superpalindromesInRange(self, L, R):
L, R = int(L), int(R)
MAGIC = 100000
ans = 0
# count odd length palindromes
for k in range(MAGIC):
s = str(k) # convert number to string
t = s + s[-2::-1] # form the palindrome by mirroring and omitting the last digit
v = int(t) ** 2 # square the palindrome
if v > R: break # stop if square is beyond upper limit
if v >= L and self.is_palindrome(v): # check if square is a palindrome and within range
ans += 1
# count even length palindromes
for k in range(MAGIC):
s = str(k) # convert number to string
t = s + s[::-1] # form the palindrome by full mirroring
v = int(t) ** 2 # square the palindrome
if v > R: break # stop if square is beyond upper limit
if v >= L and self.is_palindrome(v): # check if square is a palindrome and within range
ans += 1
return ans
def is_palindrome(self, x):
return str(x) == str(x)[::-1] # check if string representation of number is a palindrome