LeetCode-647. Palindromic Substrings

Description

Given a string, your task is to count how many palindromic substrings in this string.

The substrings with different start indexes or end indexes are counted as different substrings even they consist of same characters.

Example 1

Input: "abc"
Output: 3
Explanation: Three palindromic strings: "a", "b", "c".

Example 2

Input: "aaa"
Output: 6
Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa".

Note

The input string length won't exceed 1000.

Solution 1(C++)

class Solution{
public:
    int countSubstrings(string s) {
        int res=0;
        for(int i=0; i<s.size(); i++){
            helper(s, i, i, res);
            helper(s, i, i+1, res);
        }
        return res;
    }

private:
    void helper(string s, int i, int j, int& res){
        while(s[i] == s[j] && i>=0 && j < s.size()){
            i--; j++; res++;
        }
    }
};

Solution 2(C++)

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

算法分析

解法一:

解法一的思路还是挺简单的,首先思考要判断一个字符串是否是回文的,可以从字符串的中间的一个或者两个字符开始,往外延伸,不断判断相邻字符是否相等。所以,在解法一中,编写了一个方法,比较好的一点就是,将奇数长与偶数长的字符串统一在一起。

  1. helper(i, i, res),表示奇数长度的回文字符串
  2. helper(i,i+1, res),表示偶数长度的回文字符串

回文字符串的判断与长度求解还是蛮普遍的。可以学习这种函数的设计方法,将两种类型的回文字符串进行统一。

解法二:

使用动态规划的方法求解。设置动态数组:dp[i][j],用来表示从j到i的字符串是否是回文字符串。所以,算法说明如下:

  1. 创建一个dp矩阵,大小为s,size() * s.size(),元素类型为bool;
  2. 使用两重循环遍历dp矩阵所有元素,由于dp[i][j]表示j到i的子字符串,所以两重循环中,第一层从大到小,第二层从小到大。
  3. 如果s[i] != s[j],那么,dp[i][j]为false;如果s[i] == s[j],那么进一步判断:
  4. (1)如果i=j,那么dp[i][j]=true;
  5. (2)如果i-j=1,即s[i]与s[j]相邻,那么dp[i][j]=true;
  6. (3)非以上两种情况,那么dp[i][j]=dp[i+1][j-1];
  7. 如果dp[i][j]为true,说明j到i的子字符串是一个回文字符串,那么res+1

整理即可得到解法二。

程序分析

略。

猜你喜欢

转载自blog.csdn.net/zy2317878/article/details/80885177
今日推荐