回文专题
将力扣或者牛客的回文专题总结于此。
1. leetcode 647 回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
示例 1:
输入: "abc"
输出: 3
解释: 三个回文子串: "a", "b", "c".
示例 2:
输入: "aaa"
输出: 6
说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".
注意:
输入的字符串长度不会超过1000。
思路一:
直接两层循环:
def countSubstrings(self, s):
return sum(s[i:j] == s[i:j][::-1] for j in range(len(s) + 1) for i in range(j))
思路二:
因为回文是有一个中心的,如果是奇数串,则这个中心是一个元素,否则这个中心由两个元素组成。所以可以找到所有中心 ,由这个中心去往左右两边扩展,看看都有哪些符合条件的子回文串。
比如串 “abcba”,我们将其视作“a b c b a”, 加上空隙共有2*5-1=9个中心。 所以我们循环2*N-1次。每次以这个元素为中心,左右扩展。具体实现如下:
s = input()
num = 0
for i in range(2*len(s)-1): # 中心
left = i//2 # 以该中心对应的初始左边界
right = left+i%2 # 以该中心对应的初始有边界
while left>=0 and right<len(s) and s[left]==s[right]: # 满足条件则向两边扩展
num+=1
left-=1
right+=1
print(num)

浙公网安备 33010602011771号