Leetcode 647. Palindromic Substrings

Posted AlvinZH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 647. Palindromic Substrings相关的知识,希望对你有一定的参考价值。

问题链接

Leetcode 647

题目解析

计算字符串的回文子串数。

解题思路

一个小问题,子串(Substring)、子数组(Subarray)和子序列(Subsequence)的区别:子串和子数组是等同的,特点是连续的,比如[1,2,3]的子串有(1), (2), (3), (1,2), (2,3), (1,2,3)。而子序列不一定相邻,但相对顺序一致,比如(1,3)是[1,2,3]的一个子序列。

方法有很多种,简单讲一些。

方法一:DP

一开始定义DP[i][j]为i、j之间的回文子串数,很是麻烦,还需要另外的数组记录子串[i, j]是否是回文的。其实没有必要,直接将DP[i][j]定义成子串[i, j]是否是回文串。外循环 \(i\)\(n-1\)\(0\) 遍历,内循环 \(j\)\(i\)\(n-1\) 遍历,若s[i]==s[j]:

  • 若i==j,则dp[i][j]=true;
  • 若i和j是相邻的,则dp[i][j]=true;
  • 若i和j中间只有一个字符,则dp[i][j]=true;
  • 否则,检查dp[i+1][j-1]是否为true,若为true,那么dp[i][j]就是true。

前三条可以合并,即 \(j-i ≤ 2\)。求得dp[i][j]真值后,如果其为true,最终结果res++。

时间复杂度:\(O(n^2)\)

方法一参考代码:

class Solution {
public:
    int countSubstrings(string s) {
        int len = s.size(), res = 0;
        vector<vector<bool>> dp(len, vector<bool>(len, false));
        for (int i = len - 1; i >= 0; --i) {
            for (int j = i; j < len; ++j) {
                dp[i][j] = (s[i] == s[j]) && (j - i <= 2 || dp[i + 1][j - 1]);
                if (dp[i][j]) ++res;
            }
        }
        return res;
    }
};

方法二:回文中心法

本题可以不用DP,而是采用一种巧妙的方法:回文中心法。什么意思呢?考虑不同的回文中心,往两边扩散,求得回文数。需要考虑两种情况:如果是奇数长度回文串,了么回文中心为最中间的一个字符;如果是偶数长度回文串,这回文中心为最中间的两个字符。

每个回文子串只有一个回文中心,所以这种方法不会重复计算,也不会漏算。

时间复杂度:\(O(n^2)\)

方法二参考代码:

class Solution {
public:
    int countSubstrings(string s) {
        int len = s.size(), res = 0;
        for (int i = 0; i < len; ++i) {
            int mid1 = i, mid2 = i;//奇数
            while (mid1 >= 0 && mid2 < len && s[mid1] == s[mid2]) {
                --mid1; ++mid2; ++res;
            }
            
            mid1 = i, mid2 = i+1;//偶数
            while (mid1 >= 0 && mid2 < len && s[mid1] == s[mid2]) {
                --mid1; ++mid2; ++res;
            }
        }
        return res;
    }
};

方法三:“马拉车”算法

神奇的算法,先马一下,学会再写上。

时间复杂度:\(O(n)\)

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

以上是关于Leetcode 647. Palindromic Substrings的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 647. Palindromic Substrings

LeetCode 647. 回文子串(Palindromic Substrings)

Leetcode 647. Palindromic Substrings

[动态规划] leetcode 647 Palindromic Substrings

[Leetcode]647.Palindromic Substrings

[Leetcode]647.Palindromic Substrings