算法题-回文数及最长回文子串

  1. 回文数
    1. 转化成字符串
    2. 直接求出逆序后的数
    3. 限制int处理溢出的算法
  2. 最长回文子串

回文数

https://leetcode.cn/problems/palindrome-number/

转化成字符串

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;
    }
};

最长回文子串

https://leetcode.cn/problems/longest-palindromic-substring/

首先枚举回文子串的中心点, 假设是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;
    }
};