回文数
转化成字符串
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) return false;
string s = to_string(x);
return s == string(s.rbegin(), s.rend());
}
};
直接求出逆序后的数
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) return false;
int y = x;
long long res = 0;
while (x) {
res = res * 10 + x % 10;
x /= 10;
}
return y == res;
}
};
限制int处理溢出的算法
class Solution {
public:
bool isPalindrome(int x) {
// 小于0, 或者大于0但是末尾是0都不行
if (x < 0 || x && x % 10 == 0) return false;
int s = 0;
// 边生成逆序后的数边比较
while (s <= x) {
s = s * 10 + x % 10;
// 判断数位是奇数/偶数的情况
if (s == x || s == x / 10) return true;
x /= 10;
}
return false;
}
};
最长回文子串
首先枚举回文子串的中心点, 假设是i
.
然后从中心点i
开始, 向前向后枚举判断子串是否对称:
- 如果原字符串长度为奇数, 那么初始化
l = i - 1, r = i + 1
, 然后枚举. - 如果原字符串长度为偶数, 那么初始化
l = i, r = i + 1
然后枚举.
时间复杂度为$O(n^2)$
class Solution {
public:
string longestPalindrome(string s) {
string res;
for (int i = 0; i < s.size(); i ++) {
int l = i - 1, r = i + 1;
while (l >= 0 && r < s.size() && s[l] == s[r]) l --, r ++;
// 停止循环后, 回文串的长度是(r - 1) - (l + 1) + 1 = r - l - 1
if (r - l - 1 > res.size()) res = s.substr(l + 1, r - l - 1);
l = i, r = i + 1;
while (l >= 0 && r < s.size() && s[l] == s[r]) l --, r ++;
if (r - l - 1 > res.size()) res = s.substr(l + 1, r - l - 1);
}
return res;
}
};