Leetcode OJ 131 Palindrome Partitioning [Medium]

Leetcode OJ 131 Palindrome Partitioning [Medium]

题目描述:

Given a string s, partition s such thatevery 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"]

]

题目理解:

给定一个字符串s,划分s,使每一个子字符串都是回文的,返回所有可能的划分。

测试用例:

功能测试:“aab”、“abb”等;

特殊输入:输入s是null;s只有一个字符;

分析:

1.  递归(深度优先搜索)+循环

2.  处理“aab”:“a”是回文的,加入到ListsubString中,再处理“ab”,移除subList中最近添加的元素再继续;接着“aa”是回文的,加入到subString中,再处理“b” 移除subList中最近添加的元素再继续;接着“aab”不是回文的,不加入subString中;循环结束;

3.  当字符串的最后一位都已处理,则将subString加入到result中;

4.  判断回文的方法,可用java提供的函数将字符串翻转再比较,也可用如下方法

public boolean isPalindrome(String s, int start, int end) {
         while(start < end) {
             if(s.charAt(start) != s.charAt(end)) {
                 return false;
             }
             start++;
             end--;
         }
         return true;
}

5.  在开始计算之前,设置一个二维数组存储每一个子字符串(start,end)是否是回文:

 boolean[][] isPalindrome = new boolean[s.length()][s.length()];
        for (int start = s.length() - 1; start >= 0; start--) {
            for (int end = start; end < s.length(); end++) {
                if (end - start > 1) {
                    isPalindrome[start][end] = isPalindrome[start + 1][end - 1] && s.charAt(start) == s.charAt(end);
                } else {
                    isPalindrome[start][end] = s.charAt(start) == s.charAt(end);
                }
            }
        }

解答:

class Solution {
    public List> partition(String s) {
        char[] c = s.toCharArray();
        List> result = new ArrayList>();
        List subString = new ArrayList();
        recursion(s,result,subString,0);
        return result;
    }
    public void recursion(String s,List> result, List subString, int start){
        if(start == s.length()){
            result.add(new ArrayList(subString));

        }
        for(int end = start+1; end <= s.length(); end ++){
            String firstSubString = s.substring(start,end);
            if(isPalindrome(firstSubString)){
                subString.add(firstSubString);
                recursion(s,result,subString,end);
                subString.remove(subString.size() - 1);
            }
        }
    }
    public static boolean isPalindrome(String s){
        String rs = new StringBuilder(s).reverse().toString();
        return s.equals(rs);
    }
}


你可能感兴趣的:(Leetcode,leetcode)