LeetCode131分割回文串

分割回文串>>>
在這裏插入圖片描述

在這裏插入圖片描述

思考如何根據這顆遞歸樹編碼:

  • 每一個節點表示剩餘沒有掃描到的字符串,產生分支是截取了剩餘字符串的前綴
  • 產生前綴字符串的時候,判斷前綴字符串是否是迴文:
    * 如果 前綴字符串是迴文,則可以產生分支和節點
    * 如果前綴字符串不是迴文,則不產生分支和節點,這一步是剪枝操作
  • 在葉子節點是空字符串的時候結算,此時根節點到葉子節點的路徑,就是結果集裏的一個結果,使用深度優先遍歷,記錄所有結果

遞歸+回溯·:對一串字符串進行



package BDyNamicProgramming;

import java.util.ArrayList;
import java.util.List;


/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/4/26 0026  18:12
 */
public class Problem131 {

    public List<List<String>> partition(String s) {


            List<List<String>> rs = new ArrayList<>();
            List<String> path = new ArrayList<>();


            dfs(s,0,rs,path);

            return rs;

    }

    /**
     *
     * @param s
     * @param start  接下來從字符串中取回文子串的起始位置
     * @param rs
     * @param path
     */
    public void dfs(String s,int start,List<List<String>> rs,List<String> path){

        if(start==s.length()){
            rs.add(new ArrayList<>(path));
        }

        for(int i=start;i<s.length();i++){

            //取個子串
            String subString = s.substring(start,i+1);

            //當前取的是迴文串
            if(isPar(subString)){
                path.add(subString);
                //接着確定接下來的是否爲迴文字符串
                dfs(s,i+1,rs,path);
                path.remove(path.size()-1);
            }

        }

    }







    public boolean isPar(String s){

        int left = 0;
        int right =s.length()-1;

        while(left<=right){
            if(s.charAt(left)==s.charAt(right)){
                left++;right--;
            }else{
                return false;
            }
        }
        return true;
    }


    public static void main(String[] args) {

    }


}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章