Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning)

Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning)


给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例:

输入: "aab"
输出:
[
  ["aa","b"],
  ["a","a","b"]
]

分析:给定一个字符串,要求分割,并且要求分割出来的所有的串是回文串。
利用回溯,每次dfs分两个分支 1、不分割继续往下 2、分割后在往下

代码中dfs函数str存放字符串,n存放总长度,step存放当前位置,now是现在已经分割出来的字符串,
remain是字符串剩余还没有分割的,list里装的是分割出来的now

另外加了一个函数来判断,是否为回文串。

class Solution {
    List<List<String>> ans = new ArrayList<>();

    public List<List<String>> partition(String s) {
        if (s.length() == 0 || s == null) {
            return ans;
        }
        dfs(s,s.length(),0,"",s,new ArrayList<String>());
        return ans;
    }

    public void dfs(String str, int n, int step, String now, String remain,
            ArrayList<String> list) {
        
        
        if (n == step) {

            if (!now.equals("") && isPalindrome(now)) {
                list.add(now);
                ans.add(new ArrayList<>(list));
                list.remove(list.size() - 1);
            }else if(!remain.equals("") && isPalindrome(remain)){
                list.add(remain);
                ans.add(new ArrayList<>(list));
                list.remove(list.size() - 1);
            }else if(list.size()!=0 && String.join("",list).equals(str)){
                 
                ans.add(new ArrayList<>(list));
            }
            
            return;
        }
        
        dfs(str, n, step + 1, now + str.charAt(step),
                remain.replaceFirst(str.charAt(step) + "", ""), list);

        if (!now.equals("") && isPalindrome(now)) {
//            System.out.println(step+" "+now + " " + remain);
            list.add(now);
            dfs(str, n, step + 1, remain.charAt(0)+"", remain.replaceFirst(remain.charAt(0)+"", ""), list);
            list.remove(list.size() - 1);
            
        }

    }

    public boolean isPalindrome(String str) {

        for (int i = str.length()-1, j = 0; i>=0 && j<=str.length() && i!=j; i--, j++) {
            if (str.charAt(i) != str.charAt(j)) {
                return false;
            }
        }
        return true;
    }
}

猜你喜欢

转载自www.cnblogs.com/qinyuguan/p/11330193.html