leetcode: Palindrome Partitioning

来源:互联网 发布:淘宝追加评论期限 编辑:程序博客网 时间:2024/05/16 06:29

用动态规划可解。

二维数组dp[i][j]表示i到j是回文

状态转换方程 dp[j+1][i-1] && s[j] == s[i]

class Solution {public:    vector<vector<string>> partition(string s) {        if( s == "")            return vector< vector< string> >();        int size = s.size();        vector< vector< bool> > dp( size, vector< bool>( size, false));        for( int i = 0; i < size; ++i)            dp[i][i] = true;        for( int i = 0; i < size; ++i){            for( int j = 0; j < i; ++j){                if( s[j] == s[i] && dp[j+1][i-1]){                    dp[j][i] = true;                }                if( s[j] == s[i] && j == i - 1){                    dp[j][i] = true;                }            }        }        vector< vector< string> > res;        vector< string> t;        allPalindrome( res, s, dp, t, 0);        return res;    }    void allPalindrome( vector<vector< string> > &res, string s, vector< vector< bool> > &dp, vector< string> &t, int col){        if( col == s.size()){            res.push_back(t);            return;        }        for( int j = col; j < s.size(); ++j){//这里行坐标是固定的,因为如果这行没有true表示当前字母到后面所有字母没有回文            if(dp[col][j]){                vector< string> tmp = t;                                   tmp.push_back( s.substr(col, j-col+1));                allPalindrome( res, s, dp, tmp, j + 1);            }        }    }};


0 0
原创粉丝点击