[LeetCode] Palindrome Partitioning

来源:互联网 发布:ps如何做淘宝详情页 编辑:程序博客网 时间:2024/06/05 07:55

Subsets http://blog.csdn.net/u014425050/article/details/24138019

Total Accepted: 9269 Total Submissions: 36157

Given a string s, partition s such that every substring of the partition is a palindrome.

Return all possible palindrome partitioning of s.

For example, given s = "aab",
Return

  [    ["aa","b"],    ["a","a","b"]  ]
public class Solution {    // add the prefix palindrome into each (palindrome sets of remaining substring)    // aabc+X = {a+X, aa+X, aab+X, aabc+X}    public ArrayList<ArrayList<String>> partition(String s) {        return getSubsets(s, 0);    }        public  static ArrayList<ArrayList<String>> getSubsets(String s,  int start_index) {         ArrayList<ArrayList<String>> list = new  ArrayList<ArrayList<String>>();                if (start_index == s.length()) {            list = new  ArrayList<ArrayList<String>>();            list.add(new  ArrayList<String>());        } else {            for (int i = start_index; i < s.length(); i++) {                if (isPalindrome(s, start_index, i)) {String paliStr = s.substring(start_index, i+1);// create a new sets for each iteration    ArrayList<ArrayList<String>> allSubsets = getSubsets(s, i + 1);ArrayList<ArrayList<String>> tmpsets = new ArrayList<ArrayList<String>>();                    for (ArrayList<String> set : allSubsets) {                        ArrayList<String> tmp = new ArrayList<String>();tmp.add(paliStr);                        tmp.addAll(set);                        tmpsets.add(tmp);                    }                    list.addAll(tmpsets);                }            }        }        return list;    }        public static boolean isPalindrome(String s, int lo, int hi) {        for (int i = lo, j = hi; i < j; i++, j--) {            if (s.charAt(i) != s.charAt(j)) return false;        }                return true;    }}
public class Solution {    // check isPalindrome wit dp    public ArrayList<ArrayList<String>> partition(String s) {        ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();          ArrayList<String> partition  = new ArrayList<String>();        int len = s.length();        if (len == 0) return list;                int[][] dp = new int[len][len];                for (int i = 0; i < len; i++) dp[i][i] = 1;                for (int k = 1; k < len; k++) {            for (int i = 0; i < len - k; i++) {                int j = i + k;                if (((j == i+1) || (dp[i+1][j-1] == 1)) && s.charAt(i) == s.charAt(j)) dp[i][j] = 1;            }        }        dfs(s, 0, dp, list, partition);                return list;    }        public void dfs(String s, int start_index, int[][] dp, ArrayList<ArrayList<String>> list, ArrayList<String> partition) {        if (start_index == s.length()) list.add(new ArrayList<String>(partition));        else {            for (int i = start_index; i < s.length(); i++) {                partition.add(s.substring(start_index, i + 1));                                if (dp[start_index][i] == 1) dfs(s, i + 1, dp, list, partition);                                partition.remove(partition.size() - 1);            }        }            }}


public class Solution {    public ArrayList<ArrayList<String>> partition(String s) {        ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();          ArrayList<String> partition  = new ArrayList<String>();                dfs(s, list, partition);                return list;    }        public void dfs(String s, ArrayList<ArrayList<String>> list, ArrayList<String> partition) {        if (s.length() == 0) list.add(new ArrayList<String>(partition));        else {            for (int i = 0; i < s.length(); i++) {                String str = s.substring(0, i + 1);                                if (isPalindrome(str)) {                    partition.add(str);                    dfs(s.substring(i + 1, s.length()), list, partition);                    partition.remove(partition.size() - 1);                }            }        }    }        public static boolean isPalindrome(String s) {        for (int i = 0, j = s.length() - 1; i < j; i++, j--) {            if (s.charAt(i) != s.charAt(j)) return false;        }            return true;    }}

0 0