每日AC--leetCode--PalindromePartitioning--回溯法 递归实现

每日AC--leetCode--PalindromePartitioning--回溯法 递归实现

 

题目描述

 

Given a string s, partition s such that every substring of the partition is a palindrome.

Return all possible palindrome partitioning of s.

For example, given s ="aab",
Return

  [
    ["aa","b"],
    ["a","a","b"]
  

 

 

AC 代码:

 

/**
 * 版权所有 (c) 2017,xiaoming有限公司  
 */
package algorithm;

import java.util.ArrayList;

/**
 * 类说明
 * 
 * <pre>
 * Modify Information:
 * Author        Date          Description
 * ============ =========== ============================
 * DELL          2017年9月15日    Create this file
 * </pre>
 * 
 */

public class LeetCodePalindromePartitioning {

    // 看似字符串切分,实则可以考虑回溯法实现
    /**
     * 先看下回溯法实现  递归与非递归
      int a[n],i;
   2: 初始化数组a[];
   3: i = 1;
   4: while (i>0(有路可走)   and  (未达到目标))  // 还未回溯到头
   5: {
   6:     if(i > n)                                              // 搜索到叶结点
   7:     {   
   8:           搜索到一个解,输出;
   9:     }
  10:     else                                                   // 处理第i个元素
  11:     { 
  12:           a[i]第一个可能的值;
  13:           while(a[i]在不满足约束条件且在搜索空间内)
  14:           {
  15:               a[i]下一个可能的值;
  16:           }
  17:           if(a[i]在搜索空间内)
  18:          {
  19:               标识占用的资源;
  20:               i = i+1;                              // 扩展下一个结点
  21:          }
  22:          else 
  23:         {
  24:               清理所占的状态空间;            // 回溯
  25:               i = i –1; 
  26:          }
  27: }
  
  
  递归实现:
  
  int a[n];
   2: try(int i)
   3: {
   4:     if(i>n)
   5:        输出结果;
   6:      else
   7:     {
   8:        for(j = 下界; j <= 上界; j=j+1)  // 枚举i所有可能的路径
   9:        {
  10:            if(fun(j))                 // 满足限界函数和约束条件
  11:              {
  12:                 a[i] = j;
  13:               ...                         // 其他操作
  14:                 try(i+1);
  15:               回溯前的清理工作(如a[i]置空值等);
  16:               }
  17:          }
  18:      }
  19: }
  
     * @param 
     * @return
     */
    
    ArrayList<ArrayList<String>>  result = new ArrayList<ArrayList<String>>();
    public ArrayList<ArrayList<String>> partition(String s) {
       ArrayList<String> list = new ArrayList<String>();
       findisPalindrome(s,0,list);
       return result;
         
    }
    /**
     * @param s
     * @param i
     * @param list 
     * @return
     */
    private void findisPalindrome(String s, int start, ArrayList<String> list) {
        if(start>= s.length()&& !list.isEmpty()){
            result.add(new ArrayList(list));// 这个比较关键否则的话,如果是result.add(list)是不行的 必须New 一个
        }else{
            for(int end = start; end<=s.length(); end++){
                 String str = s.substring(start,end);
                 if(isPalindrome(str)){
                     list.add(str);
                     findisPalindrome(s,end,list);
                     list.remove(list.size()-1);//回退 进入下一个
                 }
            }
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        String  s = "aab";
        ArrayList<ArrayList<String>>  resultList = new LeetCodePalindromePartitioning().partition(s);
        for(int i = 0; i< resultList.size(); i++){
            System.out.println(resultList.get(i).toString());
        }

    }

    
    /**
     * 判断回文字符串
     * @param str
     * @return
     */
    public boolean isPalindrome(String str) {
        if(str.isEmpty()) return false;
        boolean result = true;
        for (int i = 0, j = str.length() - 1; i < j; i++, j--) {
            if (str.charAt(i) != str.charAt(j)) {
                result = false;
                break;
            }
        }
        return result;
    }
}

 

 

 

 

 

wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页
实付 19.89元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值