• 最长回文子串模板


    这里先提前注意一下,子串和子序列是两个不同的东西:

    • 子串:连续的子字符串/数组
    • 子序列:可以不连续(可间断)的子字符串/数组

    回文串是面试常常遇到的问题(虽然问题本身没啥意义),本文就告诉你回文串问题的核心思想是什么。

    首先,明确一下什:回文串就是正着读和反着读都一样的字符串

    比如说字符串abaabba都是回文串,因为它们对称,反过来还是和本身一样。反之,字符串abac就不是回文串。

    可以看到回文串的的长度可能是奇数,也可能是偶数,这就添加了回文串问题的难度,解决该类问题的核心是双指针。下面就通过一道最长回文子串的问题来具体理解一下回文串问题:

    下面,就来说一下如何使用双指针。

    寻找回文串的问题核心思想是:从中间开始向两边扩散来判断回文串。对于最长回文子串,就是这个意思:

    for 0 <= i < len(s):
        找到以 s[i] 为中心的回文串
        更新答案
    

    但是呢,我们刚才也说了,回文串的长度可能是奇数也可能是偶数,如果是abba这种情况,没有一个中心字符,上面的算法就没辙了。所以我们可以修改一下:

    for 0 <= i < len(s):
        找到以 s[i] 为中心的回文串
        找到以 s[i] 和 s[i+1] 为中心的回文串
        更新答案
    
    代码实现
    string palindrome(string &s, int left, int right){
        // 防止索引越界
        while(left >= 0 && right < s.size() && s[left] == s[right]){
            // 向两边展开
            left--;
            right++;
        }
        // 返回以s[left]和s[right]为中心的最长回文串
        return s.substr(left + 1, right - left - 1);
    }
    
    string longestPalindrome(string s){
        if(s.size() < 2)
            return s;
        int length = s.size();
        string ans;
        for(int i = 0; i < length; i++){
            // 以s[i]为中心的最长回文子串
            string s1 = palindrome(s, i, i);
            // 以s[i],s[i+1]为中心的最长回文子串
            string s2 = palindrome(s, i, i + 1);
            ans = ans.size() > s1.size() ? ans : s1;
            ans = ans.size() > s2.size() ? ans : s2;
        }
        return ans;
    }
    

    至此,这道最长回文子串的问题就解决了,时间复杂度 O(N^2),空间复杂度 O(1)。

    值得一提的是,这个问题可以用动态规划方法解决,时间复杂度一样,但是空间复杂度至少要 O(N^2) 来存储 DP table。这道题是少有的动态规划非最优解法的问题。

  • 相关阅读:
    matplotlib.pyplot.gca().set_xlim(初始值,末值) 与 matplotlib.pyplot.xticks()的区别
    MySql学习-5.查询2
    MySql学习-4.查询1
    SQL函数学习(一):substring()函数
    SQL函数学习(二):DATEADD() 函数
    SQL函数学习(三):convert()函数
    sql标识符和格式
    PIVOT就是行转列,UNPIVOT就是列传行
    行列转换之静态、动态、PIVOT方法
    sql Server函数大全
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13598547.html
Copyright © 2020-2023  润新知