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;
     }

京公网安备 11010502036488号