Monday, September 9, 2013

131. Palindrome Partitioning -M

Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
Example:
Input: "aab"
Output:
[
  ["aa","b"],
  ["a","a","b"]
]

A:


 Solution 1: brute-force solution,~~~~~ this is really stupid. 
(though we can add some dynamic programming philosophy on it.)
 第一思路,就是暴力破解。但是,太SB。

build a matrix, bool[][]  m = new bool[s.length(),s.length());
利用这个,类似于动态规划的方式,来build bottom up.
 
第三步,就是,利用10块糖的那道题,把每个字母,一个个加到尾巴上去。
首先,单独分开,加上的,肯定是可以的。
然后,就把刚加上的char ,和前面的依次combine起来s.substring(i,j+1),如果是回环,则开始加入之前的。(并最后加入
to be more efficient, 用一个一位数组numPartitionAfterPosI[i] 定义了,刚刚加入s中位置为i的这个数字的时候,
有多少个partition.  并且,其对应的partition,都放在   返回变量的的arraylist<arraylist>的最前面。
 
class Solution {
public:
    vector<vector<string>> partition(string s) {
        int n = s.length();
        if(n==0)
            return vector<vector<string>>();
        vector<vector<bool>> A;
        for(int i =0;i<n;++i)  // 
            A.push_back(vector<bool>(n,false));
        // setup the flag that whether (i,j) is palindrome
        for(int len = 1;len<=n; ++len)
            for(int start=0;start+len-1<n;++start)
            {
                int end = start+len-1;
                A[start][end] = s[start] == s[end] && (start+1<=end-1? A[start+1][end-1] :true );
            }
        
        vector<vector<vector<string>>> ALL; // ALL[i] is all palindrome ending at index i
        for(int end =0; end<n; ++end) // newly added character s[end]
        {
            vector<vector<string>> newRes;
            for(int start=end;start>=0; --start)
            {
                if( not A[start][end])
                    continue;
                string newPalin = s.substr(start,end+1-start);
                if(start == 0)
                {
                    newRes.push_back(vector<string>{newPalin});
                }else{
                    for(vector<string>& V : ALL[start-1]) //use start, not start-1, as ALL[0] is ""
                    {
                        vector<string> tmp(V);
                        tmp.push_back(newPalin);
                        newRes.push_back(tmp);
                    }
                }    
            }
            ALL.push_back(newRes);
        }
        return ALL[n-1];
    }
};

Mistakes:

            ALL.push_back(newRes);
提上了一个}里,TMMD,随手写的。  真日


--------------------------------------非DP,  递归调用----------------------
 
思路很简单, 就是,每次取下前面的一个palindrome ,然后对剩下的string, 调用本函数。
public class Solution {
public ArrayList<ArrayList<String>> partition(String s) {
        // use recursive calling
        if (s.length() == 0) {
            return null;
        }
        ArrayList<ArrayList<String>> all = new ArrayList<ArrayList<String>>();
        if (s.length() == 1) {
            ArrayList<String> al = new ArrayList<String>();
            al.add(s);
            all.add(al);
            return all;
        }
    for (int i = 1; i <= s.length(); i++) {
            String preStr = s.substring(0, i);
            if (isPalin(preStr)) {
                ArrayList<ArrayList<String>> nextAll = partition(s.substring(i));
                if (nextAll == null) {
                    ArrayList<String> al = new ArrayList<String>();
                    al.add(preStr);
                    all.add(al);
                } else {
                    // iterate nextAll, and add preStr at the beginning
                    for (int j = 0; j < nextAll.size(); j++) {
                        nextAll.get(j).add(0, preStr);
                    }
                    all.addAll(nextAll);
                }
            }
        }
        return all;
    }

    boolean isPalin(String ss) {
        int i = 0, j = ss.length() - 1;
        while (i < j) {
            if (ss.charAt(i) != ss.charAt(j)) {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }

}




Mistakes:
1: 哎,题目一上来,就理解错了。
 是partition s, for String s,就有pow(2, s.length())种不同的partition方式 (以后,面试的时候, 最少仔细看两遍题目,还是要再三问明白,然后,举个例子问面试官,看是否理解正确。)


 6: 我们一个个地加入, 当加入第j个char字符的时候, j字符,要和它前面的combine到一起。 当只和j-1 链接到一起的时候。 也要看j-2的palindrome的分割。
  // use j-2 instead of j -1, because j-1 is already combined with j  for(int i = j-1; i>=0; i--){ 这个的原因,就是头脑不清楚,没想明白,就开始写所导致。

7: 在这里
 for( int tt=0; tt< curList.size();tt++){
                                 // tt is the number of partitions that still in range[0,i-1]
                                 if(curLength > i){
                                     break;
                                 }
写成了 tt< listPartitionBeforeI.size()---------> 还是写的时候,头脑不清晰


--------------------------------------第二遍的时候,犯得错误,----------------------
1:   前面取preString 的时候,因为考虑,string.length() == 0的时候不好加
就i < s.length()了,可是,我们的设定是i 是ending position









No comments:

Post a Comment