java Palindrome Partitioning - 分割成回文串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Palindrome Partitioning - 分割成回文串相关的知识,希望对你有一定的参考价值。

//采用DFS来搜索,其实就是暴力搜索,非常类似于求数组元素的全排列问题,但是有一点不同。
public List<List<String>> partition(String s){
    List<List<String>> res = new ArrayList<>();
    List<String> temp = new ArrayList<>();
    partition_helper(s,0,temp,res);
    return res;
}
public void partition_helper(String s,int start,List<String> temp,List<List<String>> res){
    if(start==s.length()){
        List<String> t = new ArrayList<>();
        for(String item : temp) t.add(item);
        return;
    }
    for(int i = start; i < s.length(); i++){
        if(!isPalindrome(s,start,i)) continue;
        temp.add(s.substring(start,i+1));
        partition_helper(s,i+1,temp,res);
        temp.remove(temp.size()-1);
    }
}
public boolean isPalindrome(String s,int start,int end){
    while(start < end){
        if(s.charAt(start++)!=s.charAt(end--))
            return false;
    }
    return true;
}
//采用预先求DP数组,其中dp数组是二维数组,DP[i][j]代表字符串中从i到j是否是回文字符串。然后再按照上面的逻辑进行DFS从而提高效率,这样可以减少重复计算。
//又是用预数组减少重复计算。
public List<List<String>> partition(String s){
    int n = s.length();
    List<List<String>> res = new Arraylist<>();
    List<String> temp = new ArrayList<>();
    boolean[][] dp = new boolean[n][n];
    for(int i =0; i < n; i++){
        dp[i] = new boolean[n];
        for(int j = 0; j < i; j++){
            if(s.charAt(i)==s.charAt(j) && (i-j<=2 || dp[j+1][i-1]))
                dp[j][i] = true;
        }
    }
    partition_helper(s,0,dp,temp,res);
    return res;
}
public void partition_helper(String s,int start,boolean [][] dp,List<String> temp,List<List<String>> res){
    if(start==s.length()) {
        List<String> t = new ArrayList<String>();
        for(int i = start; i < s.length(); i++){
            if(!dp[start][i]) continue;
            temp.add(s.substring(start,i+1));
            partition_helper(s,i+1,temp,res);
            temp.remove(temp.size()-1);
        }
    }
}
//还是DFS,但是每次递归形式变化,传参中不再有start/temp_List/res_list,而是只有字符串,所以返回值就是List<List<>>了。
public List<List<String>> partition(String s){
    List<List<String>> s = new ArrayList<>();
    if(s.isEmpty()) return s;
    for(int i = 0; i < s.length(); i++){
        if(!isPalindrome(s,i+1)) continue;
        for(List<String> list : partition(s.substring(i+1))){
            list.add(s.substring(0,i+1));
            res.add(list);
        }
    }
}
public boolean isPalindrome(String s,int n){
    for(int i = 0 ; i < n/2; i++)
        if(s.charAt(i)!=s.charAt(n-i-1)) return false;
    return true;
}

以上是关于java Palindrome Partitioning - 分割成回文串的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 131. Palindrome Partitioning Java

leetcode 131. Palindrome Partitioning----- java

CF932G Palindrome Partition

Codeforces 932G Palindrome Partition - 回文树 - 动态规划

Leetcode 131:Palindrome Partitioning

Palindrome Partitioning