回溯算法--分割回文串

131.分割回文串

在这里插入图片描述

力扣题目链接:https://leetcode-cn.com/problems/palindrome-partitioning/

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"
输出:[["a"]]

分析

题目要求是从字符串中划分,所以就变成了我们怎样来划分来使得这些字符串变成一个回文字符串

上期我们讲的是排列组合,那里是选择某符合要求的数,这里也是一样这里不过变成了划分符合要求的数,所以排列组合用到的回溯算法这题同样适用

我们先来回顾回溯算法格式:

path=[] 存放纵向遍历暂时符合要求的
result=[]存放最终结果
void backTo(){
	if(终止条件):
		存放结果
		return 
	for(横向遍历)
		处理节点
		backTo()进行纵向遍历
		回溯 撤销对对下一步的处理
}

首先分析终止条件

因为是对一个字符串来划分,所以终止条件就是startIndex>len(s) startIndex是每一层开始横向遍历的节点,

所以

if(startIndex>len(s)):
	result.append(path)
	return 

然后分析循环过程

要对过程中的字符串是否是回文字符串进行检验 如果是回文则进行递归,如果不是则不进行递归,因为递归过程中要进行分割,都不是回文分割也没什么意义

for i in range(startIndex,len(s)):
	check_str=s[startIndex:i+1]
	if(is_huiwen(check_str):
		path.append(check_str)
	else:
		continue
	backTo(s,i+1)
	path.pop()
		

检验字符串是否为回文字符串的函数是

def is_huiwen(s):
	if(s==s[::-1] and s!=''):
		return 1
	else:
		return 0

所以综上代码为

all=[]
path=[]
def isHui(s):
    if(s==s[::-1] and s!=''):
        return 1
    else:
        return 0
def backTo(s,startIndex):
    if(startIndex>=len(s)):
        all.append(path[:])
        return
    for i in range(startIndex,len(s)):
        temp=s[startIndex:i+1]

        if(isHui(temp)):
            path.append(temp)
        else:
            continue
        backTo(s,i+1)
        path.pop()

backTo("aab" ,0)
print(all)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值