647. 回文子串
原始题目链接:https://leetcode-cn.com/problems/palindromic-substrings/
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
解题思路:
这道题和 5.
最长回文子串https://blog.csdn.net/u013243296/article/details/117423343这道题类似,就想到了使用动态规划来解题,状态是dp[i][j]表示的是字符串s的子串s[i][j]是否是回文串,根据题意,有3种条件来判断回文串:第一种是单个字符一定是回文串;第二种是两个字符,判断这两个字符是否相等来断定是否是回文串;第三种情况是,如果当前的情况下的字符串的首尾字符相等并且它的子串是回文串,那么当前情况下的字符串一定是回文串。具体实现看代码及注释。
代码实现:
class Solution:
def countSubstrings(self, s: str) -> int:
n = len(s)
# 记录结果
res = 0
# dp[i][j]:存储状态,状态表示为s[i: j]是否是一个回文串,0表示不是,1是
dp = [[0] * n for _ in range(n)]
# 开始遍历字符串
for j in range(n):
for i in range(0, j + 1):
# 当前的字符串长度
l = j - i + 1
# 当前长度是1的话表示是单个字符,一定是回文串
if l == 1:
dp[i][j] = 1
res += 1
# 两个字符的情况,需要首尾的字符相同才是回文串
if l == 2 and s[i] == s[j]:
dp[i][j] = 1
res += 1
# 大于两个字符的情况:首尾字符相同并且上一个字符串(s[i+1,j-1])是回文串
# s[i, j]才是回文串
if l > 2 and s[i] == s[j] and dp[i + 1][j - 1]:
dp[i][j] = 1
res += 1
return res
参考文献:
https://leetcode-cn.com/problems/palindromic-substrings/solution/python3-zui-jian-dan-yi-dong-de-dong-tai-gui-hua-b/