131 Palindrome Partitioning
输入一个字符串s,将s分割为n个子串,每个子串都是一个回文。返回s有多少种分割方式。
例如输入:“aab”
输出:[
[“aa”,”b”],
[“a”,”a”,”b”]
]
思路:这是一个不断将问题规模变小的问题。有点动态规划的味道。
问题1 对”aab”切分子串。首先可以看做是 “a” 和”ab”切分。第一部分”a”切分确定,并且”a”是一个回文,”ab”作为输入字符串再次回到原问题。
问题1-1 对”ab”切分子串。不断递归直到输入字符串为0。
再次回到问题1。第二可以看做是 “aa” 和”b”切分。第一部分”aa”切分确定,并且”aa”是一个回文,”b”作为输入字符串再次回到原问题。
问题1-2 对”b”切分子串。
…..不断下去。
partition(“abc”) =[ “a” + partition(“bc”)] + [ “aa” + partition(“c”)] + [ “aab” + partition(“”)]
partition(“bc”)=[“b”+partition(“c”)]
partition(“c”)=”c”
partition(“”) 添加答案,直接退出。
private List<List<String>> resultList = new ArrayList<List<String>>();public List<List<String>> partition(String s) {resultList.clear();doPartition(s,new ArrayList<String>());return resultList;}private void doPartition(String s,List<String> result){if(s==""){List<String> n = new ArrayList<String>();n.addAll(result);resultList.add(n);return;}int startIdx = 0;for(int endIdx = 1;endIdx<s.length();endIdx++){String subString = s.substring(startIdx,endIdx);if(isPalindrome(subString)){result.add(subString);doPartition(s.substring(endIdx),result);result.remove(result.size()-1);}}if(isPalindrome(s)){result.add(s);doPartition("",result);result.remove(result.size()-1);}}private boolean isPalindrome(String s){int mid = s.length()/2;int end = s.length()-1;for(int i=0;i<mid;i++){if(s.charAt(i)!=s.charAt(end-i)){return false;}}return true;}
改进
思路一模一样,只是在处理的时候尽量少使用String的substring方法。参考链接。substring会创建一个新的String对象,同时有一个数组拷贝的动作。该版本的速度大大提升。
private List<List<String>> resultList = new ArrayList<List<String>>();public List<List<String>> partition(String s) {resultList.clear();doPartition(s,0,new ArrayList<String>());return resultList;}private void doPartition(String s,int leftIdx,List<String> result){if(leftIdx==s.length()){List<String> n = new ArrayList<String>();n.addAll(result);resultList.add(n);return;}for(int endIdx = leftIdx;endIdx<s.length();endIdx++){if(isPalindrome(s,leftIdx,endIdx)){result.add(s.substring(leftIdx,endIdx+1));doPartition(s,endIdx+1,result);result.remove(result.size()-1);}}}private boolean isPalindrome(String s,int l,int r){if(l==r) return true;while(l<r){if(s.charAt(l)!=s.charAt(r)){return false;}l++;r--;}return true;}