因为R的长度是18,那么超级回文数最多不超过10^9,那两边不会超过10^5
枚举,构造回文串x(<10^5),并判断x^2是否为回文串
class Solution {
private:
string ltos(long l)
{
ostringstream os;
os << l;
string res;
istringstream is(os.str());
is >> res;
return res;
}
bool check(string s)
{
int l = 0, r = s.size() - 1;
while(l < r)
{
if(s[l] != s[r]) return false;
l++;
r--;
}
return true;
}
public:
int superpalindromesInRange(string L, string R) {
long left = stol(L);
long right = stol(R);
int magic = 100000;
int res = 0;
//构造长度为奇数的回文串
for(int k = 1; k < magic; k++)
{
string tmp = to_string(k);
int n = tmp.size();
for(int i = n - 2; i >= 0; i--)
{
char a = tmp[i];
tmp.append(1, a);
}
long val = stol(tmp);
val *= val;
if(val > right) break;
if(val >= left && check(ltos(val)))
{
res++;
}
}
//构造长度为偶数的回文串
for(int k = 1; k < magic; k++)
{
string tmp = to_string(k);
int n = tmp.size();
for(int i = n - 1; i >= 0; i--)
{
char a = tmp[i];
tmp.append(1, a);
}
long val = stol(tmp);
val *= val;
if(val > right) break;
if(val >= left && check(ltos(val)))
{
res++;
}
}
return res;
}
};