T131分割回文串

思想先看如何分割串s:以串s的每一个位置为分割点,将s分割成两部分[start,end]以及剩下的一部分[end+1,len-1],依次判别本次分割出的子串[start,end]是否回文(本题的特殊要求),是的话符合要求,继续对剩下的那部分[end+1,len-1]进行递归分割即可
此时注意一下,进行下一步的前题是当前划分的子串为回文串才行,而判断一个子串是否为回文串,可以先进行预处理:提前利用dp思想找出s中的回文子串,这样在后续回溯时,可以直接以此来进行判断,不用再去重新判断了

class Solution {
    List<List<String>> res = new ArrayList<>();
    public void generateAll(String s,int start,boolean[][]isHW,List<String>trace){//对串s从start处开始切
       if(start==s.length()){//分割完了
           res.add(new ArrayList<>(trace));
           return;
       } 
       for(int end=start;end<s.length();end++){
          if(isHW[start][end]){
              trace.add(s.substring(start,end+1));
              generateAll(s,end+1,isHW,trace);//对串s的剩下部分进行切割
              trace.remove(trace.size()-1);
          }
       }   
    }
    public List<List<String>> partition(String s) {
       int len = s.length();
       if(len<=0) return res;
       boolean[][]isHW = new boolean[len][len];
       for(int subLen=1;subLen<=len;subLen++){
           for(int start=0;start<len;start++){
               int end = start+subLen-1;
               if(end>=len)continue;
               isHW[start][end] = (subLen==1)||(subLen==2||isHW[start+1][end-1])&&s.charAt(start)==s.charAt(end);
           }
       }
       generateAll(s,0,isHW,new ArrayList<>());
       return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值