131.分割回文串

本文介绍了一种使用回溯算法解决LeetCode 131题——分割回文串的方法。通过横向和纵向遍历,结合双指针判断回文数的技术,实现了所有可能的分割方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://leetcode.cn/problems/palindrome-partitioning/

思路:

先思考暴力算法能否可行?
很明显是不行的,以aab为例,需要一个一个遍历
首先需要遍历aab,例如先遍历到a,判断a是回文数,然后剩下ab
需要对ab进行遍历、判断a或者ab是否是回文数
首先判断ab不是,然后a|a|是回文数
之后还需要对剩下的b进行判断,判断b是否是回文数
相当于需要3层遍历,所以得使用回溯算法
image.png

回溯思路:
1、首先是横线切割,使用for进行遍历即可,相当于第一层,对a,a,b一个一个进行切割
2、纵向遍历,使用的是递归,记住递归的方式,相当于自己调自己,然后切割从下一个开始,以先切割a为方式,相当于需要对ab进行切割
3、确认什么是回文数?如果是回文数,且切割到最后一个数据的时候,则可以将数据放入结果了

使用队列进行数据的短暂存放 Deque

/**
    * 131. 分割回文串
    */

//用于存放最终结果
    private List<List<String>> res131=new ArrayList<>();
//队列 存放遍历的数据
    private Deque<String> path131=new ArrayDeque<>();


    public List<List<String>> q131(String s) {
        bt131(s,0);
        return res131;
    }


//
    private void bt131(String s,Integer index){
        //如果切割的下标>=数组的长度的时候,则证明是最后一个数据
        //就可以将起加入数组中了
        if(index>=s.length()){
            res131.add(new ArrayList<>(path131));
            return;
        }


        //横向遍历
        for (int i = index; i <s.length() ; i++) {
            if(isHuiwen(s,index,i)){
                path131.addLast(s.substring(index,i+1));
            }else{
                continue;
            }
            
            //纵向遍历,对当前i之后的数据进行切割
            bt131(s,i+1);
            //需要将队列中的最后一个移除
            path131.removeLast();
        }
    }

    //回文数:双指针
    private boolean isHuiwen(String s, Integer start, Integer end){
        for (int i = start,j=end; i < j ; i++,j--) {
           if(s.charAt(i)!=s.charAt(j)) {
               return false;
           }
        }
        return true;
    }

写的还不是很好,需要继续学习如何更好的表述!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WalkerShen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值