回文专题

将力扣或者牛客的回文专题总结于此。

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)

 

posted @ 2019-07-07 22:19  三年一梦  阅读(162)  评论(0)    收藏  举报