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

深度优先搜素

复杂度

时间 O(N^2) 空间 O(N)

思路

因为我们要返回所有可能的分割组合,我们必须要检查所有的可能性,一般来说这就要使用DFS,由于要返回路径,仍然是典型的做法:递归时加入一个临时列表,先加入元素,搜索完再去掉该元素。对每一种可能性都调用isPalindrome函数来判断。

代码

public class Solution {
    
    List<List<String>> res;
    public List<List<String>> partition(String s) {
        res = new LinkedList<List<String>>();
        List<String> tmp = new LinkedList<String>();
        helper(s, 0, tmp);
        return res;
    }
    
    private void helper(String s, int start, List<String> tmp){
        if(start >= s.length()){
            List<String> list = new LinkedList<String>(tmp);
            res.add(list);
            return;
        }
        // 搜索可能的字串,如果是回文就继续搜索
        for(int i = start; i < s.length(); i++){
            String sub = s.substring(start, i+1);
            if(isPalindrome(sub)){
                tmp.add(sub);
                helper(s, i+1, tmp);
                tmp.remove(tmp.size()-1);
            }
        }
    }
    
    private boolean isPalindrome(String s){
        int i = 0, j = s.length() - 1;
        while(i<j){
            if(s.charAt(i)==s.charAt(j)){
                i++;
                j--;
            } else {
                return false;
            }
        }
        return true;
    }
}

ethannnli
858 声望360 粉丝