Leetcode - Palindrome Partitioning

My code:

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public List<List<String>> partition(String s) {
        ArrayList<List<String>> ret = new ArrayList<List<String>>();
        if (s == null || s.length() == 0)
            return ret;
        ArrayList<String> slide = new ArrayList<String>();
        helper(s, 0, s.length() - 1, ret, slide);
        return ret;
    }
    
    private void helper(String s, int begin, int end,
            ArrayList<List<String>> ret, ArrayList<String> slide) {
        if (begin > end) {
            ret.add(new ArrayList<String>(slide));
            return;
        }
        else if (begin == end) {
            slide.add(s.substring(begin, end + 1));
            ret.add(new ArrayList<String>(slide));
            slide.remove(slide.size() - 1);
            return;
        }
        
        for (int len = 1; len <= end - begin + 1; len++) {
            String tmp = s.substring(begin, begin + len);
            if (!isPalindrome(tmp))
                continue;
            slide.add(tmp);
            helper(s, begin + len, end, ret, slide);
            slide.remove(slide.size() - 1);
        }
        
    }
    
    private boolean isPalindrome(String tmp) {
        if (tmp == null)
            return false;
        else if (tmp.length() == 0 || tmp.length() == 1)
            return true;
        for (int i = 0; i < tmp.length(); i++) {
            if (tmp.charAt(i) != tmp.charAt(tmp.length() - i - 1))
                return false;
        }
        return true;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        System.out.println(test.partition("bb"));
    }
}

状态不是很好,这种题目跑了两次才AC
感觉学长说的很对。hard题目不用很会做。但是medium和easy题目必须给一道题目,立刻就能做出来,在白板上写出来。思路要很清晰,考点要很清楚。
刷题还是很重要的。

**
总结: DFS
**

Anyway, Good luck, Richardo!

都不记得自己做了这道题目。。。
一开始看到以为要用DP。
傻逼啊!!
记住了,只有涉及到求,极值的时候,才需要考虑使用DP。
或者就是模式匹配。
反正,一开始都先想办法用 brute force 做出来。

My code:

public class Solution {
    public List<List<String>> partition(String s) {
        ArrayList<List<String>> ret = new ArrayList<List<String>>();
        
        if (s == null || s.length() == 0) {
            return ret;
        }
        
        helper(0, s, ret, new ArrayList<String>());
        return ret;
    }
    
    private void helper(int begin, String s, List<List<String>> ret, List<String> group) {
        if (begin >= s.length()) {
            ret.add(new ArrayList<String>(group));
        }
        else {
            for (int i = begin + 1; i <= s.length(); i++) {
                String temp = s.substring(begin, i);
                if (!isPalindrome(temp)) {
                    continue;
                }
                else {
                    group.add(temp);
                    helper(i, s, ret, group);
                    group.remove(group.size() - 1);                    
                }
            }
        }
    }
    
    private boolean isPalindrome(String s) {
        if (s == null || s.length() == 0) {
            return true;
        }
        int begin = 0;
        int end = s.length() - 1;
        while (begin < end) {
            if (s.charAt(begin) != s.charAt(end)) {
                return false;
            }
            else {
                begin++;
                end--;
            }
        }
        return true;
    }
}

然后现在想下,是可以优化这个算法的。
怎么优化,也就是设计一个cache
cache[i][j] = true 表示 从 [i, j] 段是回文,就不用再算一遍了。这样应该可以加快速度。

Anyway, Good luck, Richardo! — 08/20/2016

    原文作者:Richardo92
    原文地址: https://www.jianshu.com/p/58ab4f24f826#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞