"""
题目:给定一个字符串,请问该字符串中有多少个回文连续子字符串?例如,字符串'ABC'有3个回文子字符串,分别为'A','B','C';
而字符串‘AAA'有6个回文子字符串,分别为’A','A','A','AA','AA','AAA'
解题思路:这个题上来一看,我的脑子里就把它翻译为求子字符串为回文的个数。
前面已经做了很多子数组或者子字符串的题了,那一定是要用到双指针了。核心逻辑就是如何移动双指针。
首先确定双指针的起始位置和方向:
如果按照之前的两道回文的题目的逻辑,将双指针放在字符串的两头,然后向中间移动,思考一下就会发现移动完以后,只能得到一个回文
因此参考前面满足条件的子字符串的个数的逻辑(第14~17题),指针P1和指针P2应都从左边向右边移动。
然后确定双指针的移动算法:
回文不仅能通过从两端往中间看是否两端相等,也可以从中间开始逐步向两边扩散看两端是否相等。
因此参考这个逻辑,我们可以将指针逐个指向子回文的中间,然后判断它两端的字符是否一致,直到字符串两端。
例如,刚开始指向第一个元素,然后向两端扩散,扩散完后,发现只有它自己的回文。然后指向第二个元素,如此循环,直到指向最后一个元素。
这里要注意的是,回文的长度可以为奇数,也可以为偶数。长度为奇数的的回文对称中心只有一个字符,长度为偶数的字符串对称中心有两个字符。
因此如果是奇数字符串,两个指针应都从一个位置开始。如果是偶数字符串,指针P2要比指针P1多1.
"""
import re
def mirror_count_from_middle(t, start, end):
count = 0
while start >= 0 and end <= len(t)-1 and t[start] == t[end]:
start -= 1
end += 1
count += 1
return count
def mirror_count(t):
pattern = re.compile('[a-zA-Z0-9]')
new_t = pattern.findall(t.upper())
count = 0
for i in range(len(new_t)):
count += mirror_count_from_middle(new_t, i, i)
count += mirror_count_from_middle(new_t, i, i+1)
return count
t = 'aaa'
t1 = 'abc'
t2 = 'asdffgg'
t3 = ''
print(mirror_count(t))
print(mirror_count(t1))
print(mirror_count(t2))
print(mirror_count(t3))
《剑指offer》面试题20:回文子字符串的个数
最新推荐文章于 2022-09-01 20:01:45 发布