美文网首页
Palindrome Partitioning

Palindrome Partitioning

作者: 瞬铭 | 来源:发表于2019-12-10 19:06 被阅读0次

    https://leetcode.com/problems/palindrome-partitioning/
    给定一个字符串S,求出这个字符串的子集,满足每一个子字符串都是回文字符串

    Input: "aab"
    Output:
    [
      ["aa","b"],
      ["a","a","b"]
    ]
    

    DFS大法

    dfs的定义:从第start个元素开始,到字符串结尾的所有回文子集字符串的集合

    input: "aab"
    dfs("aab",0,out,res);  out = ["a"];
         dfs("aab",1,out,res);out = ["a","a"];
             dfs("aab",2,out,res); out = ["a","a","b"];
                 dfs("aab",3,out,res) out = ["a","a","b"]; res = [["a","a","b"]];
            dfs("aab",2,out,res);out=["a","a"]
        dfs("aab",1,out,res);out=["a"]
    dfs("aab",0,out,res); out = ["aa"];
       dfs("aab",1,out,res);out = ["aa","b"];
      ...
      ...
    
    /**
         * @param s
         * @return
         */
        public List<List<String>> partition(String s) {
            List<String> item = new ArrayList<String>();
            List<List<String>> res = new ArrayList<List<String>>();
    
            if (s == null || s.length() == 0) {
                return res;
            }
    
            partitionHelper(s, 0, item, res);
            return res;
        }
    
    
        //从第start个元素开始,到字符串结束,能组成的所有回文字符串子集
        public void partitionHelper(String s, int start, List<String> out, List<List<String>> res) {
    
            //当start等于s的长度,实际上已经超出了s的index范围(s的index范围是0~s.length-1)
            //把out作为一个结果集放入res中
            if (start == s.length()) {
                res.add(new ArrayList<String>(out));
                return;
            }
    
    
            for (int i = start; i < s.length(); i++) {
                //从第start个元素开始遍历,如果第start到第i+1之间的子集为回文子串
                //则继续计算i+1后面余下的子串的回文问题
                String str = s.substring(start, i + 1);
                if (isPalindrome2(str)) {
                    out.add(str);
                    partitionHelper(s, i + 1, out, res);
                    out.remove(out.size() - 1);
                }
            }
        }
    
        public boolean isPalindrome2(String s) {
            int low = 0;
            int high = s.length() - 1;
            while (low < high) {
                if (s.charAt(low) != s.charAt(high))
                    return false;
                low++;
                high--;
            }
            return true;
        }
    

    相关文章

      网友评论

          本文标题:Palindrome Partitioning

          本文链接:https://www.haomeiwen.com/subject/iggwgctx.html