本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
题目链接:LeetCode 647. 回文子串 难度:中等
一、题目描述
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:"abc"
输出:3
解释:三个回文子串: "a", "b", "c"
示例 2:
输入:"aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
提示:输入的字符串长度不会超过 1000 。
二、思路分析
对于每一个串,先判断最左最右边是否相等,再判断剩余子串是否为回文串,就能判断出当前串是不是回文串了。
也就是说,子串对于更长的串的判断是有贡献的。可以用dp[i][j]存储i到j的子串是否为回文串,从长度为1和长度为2的子串出发,判断长度为3的串,再判断长度为4的串...一直到判断整个字符串。
这也就是所谓的动态规划(DP)了。
三、AC 代码
def countSubstrings(self, s: str) -> int:
n = len(s)
dp = [[0 for _ in range(n)] for _ in range(n)]
dp[0][0] = 1
res = 1
for i in range(1,n):
dp[i][i] = 1
res+=1
if s[i-1] == s[i]:
dp[i-1][i] = 1
res+=1
length = 3
while length <= n:
for i in range(n-length+1):
start = i
end = start+length-1
if s[start] == s[end] and dp[start+1][end-1] == 1:
dp[start][end] = 1
res += 1
# print(start,end)
length += 1
return res
四、总结
遇到这类问题,思考小问题对于大问题的解决是有贡献,如果有贡献,就从小问题开始,不断解决更大的问题。
如果你觉的还不错的话,给我点个赞吧💐