Leetcode OJ 131 Palindrome Partitioning [Medium]

来源:互联网 发布:洗衣机 品牌 知乎 编辑:程序博客网 时间:2024/06/09 21:29

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”是回文的,加入到List<String>subString中,再处理“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<List<String>> partition(String s) {        char[] c = s.toCharArray();        List<List<String>> result = new ArrayList<List<String>>();        List<String> subString = new ArrayList<String>();        recursion(s,result,subString,0);        return result;    }    public void recursion(String s,List<List<String>> result, List<String> 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);    }}


原创粉丝点击