回溯算法--分割回文串

Posted Rgylin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯算法--分割回文串相关的知识,希望对你有一定的参考价值。

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)

以上是关于回溯算法--分割回文串的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode回溯算法#05分割回文串(复习双指针判断回文以及substr函数使用记录)

代码随想录|day26|回溯算法part03● 39. 组合总和● 40.组合总和II● 131.分割回文串

(回溯法)Java 求解分割回文串

131. 分割回文串回溯Normal

131. 分割回文串 回溯

Leetcode——分割回文串