Palindrome Partitioning Leetcode
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"] ]
This is the problem has the dfs idea.
public class Solution { List<List<String>> result; List<String> current; public List<List<String>> partition(String s) { result = new ArrayList<>(); current = new ArrayList<>(); helper(s, 0); return result; } public void helper(String s, int l) { if (l >= s.length()) { result.add(new ArrayList<>(current)); } for (int i = l; i < s.length(); i++) { if (isPalindrome(s, l, i)) { current.add(s.substring(l, i + 1)); helper(s, i + 1); current.remove(current.size() - 1); } } } public boolean isPalindrome(String s, int i, int j) { while (i < j) { if (s.charAt(i) != s.charAt(j)) { return false; } i++; j--; } return true; } }
We can also solve it using dp method.
public class Solution { public List<List<String>> partition(String s) { int len = s.length(); List<List<String>>[] result = new List[len + 1]; boolean[][] pair = new boolean[len][len]; result[0] = new ArrayList<>(); result[0].add(new ArrayList<>()); for (int i = 0; i < len; i++) { result[i + 1] = new ArrayList<>(); for (int j = 0; j <= i; j++) { if (s.charAt(j) == s.charAt(i) && (i - j <= 1 || pair[j + 1][i - 1])) { pair[j][i] = true; String str = s.substring(j, i + 1); for (List<String> l : result[j]) { List<String> newL = new ArrayList<>(l); newL.add(str); result[i + 1].add(newL); } } } } return result[len]; } }
But it is not so fast and used a lot of memory. 这道题一定要回顾,太不熟练了。。。