LeetCode647. Palindromic Substrings

版权声明:本文为博主原创文章,欢迎转载!转载请保留原博客地址。 https://blog.csdn.net/grllery/article/details/85720056

647. Palindromic Substrings

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:

  1. The input string length won't exceed 1000.

题目:判断给定的字符串中回文子串的个数.

回文有两种模式,aba或者abba.因此分别对回文中心为奇数和偶数进行判断,如果回文中心两侧的字符相等,那么该子串为回文.

第一种方式是先固定回文中心,然后不断的向两侧外扩,判断两侧的值是否相等.如果相等,为回文.如果不相等,更新回文中心.

#include<iostream>
using namespace std;


class Solution {
public:
    int countSubstrings(string s) {
        for(size_t i=0; i<s.size();i++){
            //分别考虑回文中心为奇数和偶数的情况
            expand(s, i, i);
            expand(s, i, i+1);
        }
        return count;
    }

private:
    int count=0;

    void expand(const string &s, int start, int end){
        while(start >= 0 && end < s.length() && s[start] == s[end]){
            start--;
            end++;
            count++;
        }
    }
};

int main(int argc, char const *argv[])
{
    Solution sln;
    cout << sln.countSubstrings("abccba") << endl;
    return 0;
}

还有一种方法是先固定一种回文长度,然后对字符串中的每个位置截取该长度的子串进行判断.如果第i个字符到第j个字符所组成的子串为回文,那么dp[i][j]=true,否则为false.那么我们就可以根据dp[i][j]的值以及s[i-1]和s[j+1]是否相等来更新dp[i-1][j+1].

#include<iostream>
#include<vector>
using namespace std;


class Solution {
public:
    int countSubstrings(string s) {
        if(s.length() == 0)
            return 0;
        
        vector<vector<bool>> dp(s.length(), vector<bool>(s.length(), false));

        int count = 0;
        for(int i=0; i< s.length(); i++){
            
            dp[i][i] = true;
            count++;
            if(i+1 < s.length() && s[i] == s[i+1]){
                dp[i][i+1] = true;
                //cout << i<<"," << i+1 << endl;
                count++;
            }
        }

        //截取substrlen长度的字符串,判断两侧的字符是否相等
        for(int substrlen = 1; substrlen<=s.length(); substrlen++){
            for(int i = 1; i< s.length()-substrlen; i++){
                int j = i+substrlen-1;
                if(dp[i][j] && s[i-1] == s[j+1]){
                    dp[i-1][j+1] = true;
                    //cout << i-1 <<"," << j+1 << endl;
                    count++;
                }
            }
        }
        return count;
    }
};


int main(int argc, char const *argv[])
{
    Solution sln;
    cout << sln.countSubstrings("abccba") << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/grllery/article/details/85720056