回文字符串寻找
- 回文字符串寻找问题的介绍
- 回文字符串寻找的算法分析
- 回文字符串寻找代码实现
回文字符串寻找问题的介绍
给定字符串s,寻找字符串中所有的回文字符串,回文字符串的寻找本质上是子集问题,例如字符串str="12321"的回文字符串寻找,
就是从集合{0,1,2,3,4}中选取两个数字来作为子串的索引,来找出子串中所有的回文字符串
str[0,1]="1"
str[0,5]="12321"
str[1,2]="2"
str[1,4]="232"
str[2,3]="3"
str[3,4]="2"
str[4,5]="1"
回文字符串寻找的算法分析
第一步:从集合{0,1,2,3……len(str)}中选一数做为字符串的初始索引
第二步:从集合{0,1,2,3……len(str)}中选一个不小于第一步数作为结束索引,判断子串是否为回文字符串,如果是输出。
回文字符串寻找的代码实现
def ispalindrome(s):#判断是否是回文字符串
return s==s[::-1]
res=[0]#保存res[step]的结果
def dfs(step,s):
if(step>2):#仅需两部即可完成一次选择
if(ispalindrome(s[res[1]:res[2]+1])):
print("str[{},{}]=".format(res[1],res[2]+1),s[res[1]:res[2]+1])
return
for i in range(0,len(s)):#每次选择一个可能的索引值
if(i>=res[step-1]):#每次选择的索引值不小于上一次
res.append(i)#保存结果
dfs(step+1,s)
res.pop()#撤销上一次的选择
dfs(1,"12321")
小结
- 根据回文字符串寻找,理解回溯算法在限定子集问题中的应用
- 掌握回文字符串寻找求解的回溯算法
习题
- 上述问题中递归的深度仅为2,因此理论上可以通过一个两重循环去解决它,请尝试解决?
- 如果将该问题改变为回文字符串的分割问题,即将字符串分割成的子串都是回文字符串,请用回溯的方法解决它