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