leetcode131(分割字符串:动态规划预处理+回溯)

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。

输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]

题解:动态规划预处理+回溯

       采用动态规划的方法对字符串进行预处理,找出其中所有的回文子串,然后利用回溯算法枚举所有的分割方案,将不满足每个子串都是回文串的方案排除在外。

class Solution {
    List<List<String>>ans=new ArrayList<>();
    List<String>parts=new ArrayList<>();
    boolean[][]dp;
    public List<List<String>> partition(String s) {
        int l=s.length();
        dp=new boolean[l][l];
        for(int i=0;i<l;i++){
            dp[i][i]=true;
        }
        for(int i=1;i<l;i++){
            for(int j=0;j+i<l;j++){
                if(s.charAt(j)==s.charAt(j+i)){
                    if(j+1>j+i-1|| dp[j + 1][j + i - 1]){
                        dp[j][j+i]=true;
                    }
                }
            }
        }
        DFS(0,s.length(),s);
        return ans;
    }
    public void DFS(int i,int l,String s){
        if(i>l){
            return;
        }
        if(i==l){
            ans.add(new ArrayList<>(parts));
        }
        for(int k=1;k+i<=l;k++){
            if(dp[i][i+k-1]){
                parts.add(s.substring(i,i+k));
                DFS(i+k,l,s);
                parts.remove(parts.size()-1);
            }
        }
    }
}
上一篇:Jsp和Servlet有什么区别?


下一篇:人脸识别项目实战