【leetcode刷题笔记】Palindrome Partitioning

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"]

  ]

题解:以aab来说明算法:

  1. 看第一个字符a,判断是否为回文,发现是回文,那么递归的判断剩下的ab是否回文;
  2. 看前两个字符aa,判断是否回文,发现是回文,那么递归的判断剩下的b是否回文;
  3. 看前3个字符aab,判断是否是回文,发现不是回文。
  4. 循环结束。

所以这一个典型的递归算法:首先判断s(0,i)是否是回文,如果是,将s(0,i)暂存到result列表中,再递归的判断s(i+1,s.length)是否是回文,递归返回时,将s(0,i)从result中拿出来,继续循环判断s(0,i+1)是否回文......在递归的过程中,如果传递给递归函数的s是空串,说明找到了一中分割方法,并且存放在result列表中,那么此时就把result放到最终的答案列表answer中。

代码如下:

 1 public class Solution {

 2     private boolean isPar(String s){

 3         int begin = 0;

 4         int end = s.length() - 1;

 5         

 6         while(begin < end){

 7             if(s.charAt(begin) != s.charAt(end))

 8                 return false;

 9             

10             begin++;

11             end--;

12         }

13         

14         return true;

15     }

16     public void partitionDfs(String s,List<String> result,List<List<String>> answer){

17         if(s.length() == 0){

18             List<String> temp = new ArrayList<String>(result);

19             answer.add(temp);

20             return;

21         }

22         

23         int length = s.length();

24         for(int i = 1;i <= length;i++){

25             String sub = s.substring(0,i);

26             if(isPar(sub)){

27                 result.add(sub);

28                 partitionDfs(s.substring(i), result, answer);

29                 result.remove(result.size()-1);

30             }

31         }

32         

33     }

34     public List<List<String>> partition(String s) {

35         List<List<String>> answer = new ArrayList<List<String>>();

36         List<String> result = new ArrayList<String>();

37         partitionDfs(s, result, answer);

38         

39         return answer;

40     }

41 }

你可能感兴趣的:(partition)