📅  最后修改于: 2023-12-03 15:12:29.087000             🧑  作者: Mango
题目描述:给定一个字符串,每次可以删除它的一个回文子字符串,重复此操作直到字符串为空。求最少的删除次数。
这是一道很有趣的字符串题目,涉及到回文串的判断和删除。解题思路主要是贪心算法。
从最小回文子串开始贪心,每次寻找最小回文子串并删掉它,直到字符串为空为止。
关键在于如何求最小回文子串。可以采用 Manacher 算法来求解。
具体思路参见代码实现。
def minSteps(s: str) -> int:
res = 0
while s:
# 求最小回文子串
i = 0
j = len(s) - 1
while i < j:
if s[i] == s[j]:
i += 1
j -= 1
else:
j -= 1
if i == j:
res += 1
break
else:
# 删除最小回文子串
res += 2
s = s[:i] + s[j+1:]
return res
Manacher 算法的时间复杂度为 O(n)。因为要删除回文子串,所以最多需要操作 n 次,时间复杂度为 O(n^2)。
Manacher 算法的空间复杂度为 O(n)。
[1] Manacher 算法。https://www.cnblogs.com/grandyang/p/4475985.html。
[2] 删除回文子序列。https://blog.csdn.net/qaz334455/article/details/104066556。