###### tags: `Leetcode` `medium` `dynamic programming` `python` `c++` # 647. Palindromic Substrings ## [題目連結:] https://leetcode.com/problems/palindromic-substrings/ ## 題目: Given a string ```s```, return the number of **palindromic substrings** in it. A string is a **palindrome** when it reads the same backward as forward. A **substring** is a contiguous sequence of characters within the string. **Example 1:** ``` Input: s = "abc" Output: 3 Explanation: Three palindromic strings: "a", "b", "c". ``` **Example 2:** ``` Input: s = "aaa" Output: 6 Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa". ``` ## 解題想法: * 此題為計算有多少個回文子字串 * 經典DP: * 定義dp[i][j]: **s[i]~s[j]是否為回文** * 則dp[i][j]為True的條件: * 基本最低標準: s[i]==s[j] 加上: * case1: 只有1個字or2個字 * case2: 去掉左右,dp[i+1][j-1]仍為True * 解題思考: * 對於看到判斷條件i,需要用到i+1來判斷: * 則i迴圈為**從尾到頭**判斷,才能滿足 ## Python: ``` python= class Solution(object): def countSubstrings(self, s): """ :type s: str :rtype: int """ #dp[i][j]: s[i]~s[j]是否為迴文 #dp[i][j]為True的條件 #只有一個字or兩個字 #去掉左右,dp[i+1][j-1]仍是迴文 res=0 n=len(s) dp=[[False for _ in range(n)] for _ in range(n)] for i in range(n-1, -1, -1): for j in range(i, n): if s[i]==s[j]: if (j-i<2) or dp[i+1][j-1]==True: dp[i][j]=True res+=1 return res result= Solution() ans=result.countSubstrings(s="aaa") print(ans) ``` ## C++: ``` cpp= #include<bits/stdc++.h> using namespace std; class Solution { public: int countSubstrings(string s) { int res=0, n=s.size(); vector<vector<bool>> dp(n, vector<bool>(n, false)); for (int i=n-1; i>=0; i--){ for (int j=i; j<n; j++){ if (s[i]==s[j]){ if ((j-i<2) || dp[i+1][j-1]==true){ dp[i][j]=true; res+=1; } } } } return res; } }; ```