1、给定一个字符串s,分割s使得s的每一个子串都是回文串返回所有的回文分割结果。(注意:返回结果的顺序需要和输入字符串中的字母顺序一致。)
例如:给定字符串s="aab",
返回 :[↵ ["aa","b"],↵ ["a","a","b"]↵ ]
import java.util.*;
public class Solution {
public ArrayList<ArrayList<String>> partition(String s) {
ArrayList<ArrayList<String>> lists = new ArrayList<>();
ArrayList<String> list = new ArrayList<>();
partitionHepler(lists, list, s);
return lists;
}
public void partitionHepler(ArrayList<ArrayList<String>> lists, ArrayList<String> list, String s){
if(s == null || s.length() == 0){
lists.add(new ArrayList<String>(list));
return;
}
int len = s.length();
for(int i=0; i<=len; i++){
String strSub = s.substring(0, i);
if(isPalindrome(strSub)){
list.add(strSub);
partitionHepler(lists, list, s.substring(i, len));
list.remove(list.size()-1);
}
}
}
public boolean isPalindrome(String s){
if(s == null || s.length() == 0) return false;
int len = s.length();
int mid = len/2;
for(int i=0; i<mid; i++){
if(s.charAt(i)!=s.charAt(len-1-i)) return false;
}
return true;
}
}
2、
给出一个字符串s,分割s使得分割出的每一个子串都是回文串计算将字符串s分割成回文分割结果的最小切割数
例如:给定字符串s="aab",返回1,因为回文分割结果["aa","b"]是切割一次生成的。
public int minCut(String s) {
char[] chs = s.toCharArray();
int[] dp = new int[chs.length+1];
for(int i=0; i<dp.length; i++) dp[i] = i-1;
for(int i=0; i<chs.length; i++){
expand(chs, i, i, dp);
expand(chs, i, i+1, dp);
}
return dp[chs.length];
}
private void expand(char[] chs, int i, int j, int[] dp){
while(i>=0 && j<chs.length && chs[i] == chs[j]){
dp[j+1] = Math.min(dp[j+1], dp[i]+1);
--i;
++j;
}
return;
}