Leetcode Palindrome Partitioning

来源:互联网 发布:d3.js官网 编辑:程序博客网 时间:2024/06/16 16:34

Palindrome Partitioning

 Total Accepted: 4585 Total Submissions: 18745My Submissions

Given a string s, partition s such that every 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"]  ]


典型的递归回溯法,当然可以利用动态规划法提高点效率。

下面是标准的递归回溯程序:

vector<vector<string> > partition(string s) {vector<vector<string> > rs;vector<string> tmp;storePatition(rs, tmp, s);return rs;}void storePatition(vector<vector<string> > &rs, vector<string> &tmp,string &s){if (s.empty()){rs.push_back(tmp);return;}for (int i = 1; i <= s.length(); i++){string a = s.substr(0, i);if (isPalindrome(a)){tmp.push_back(a);string b = s.substr(i);storePatition(rs, tmp, b);tmp.pop_back();}}}bool isPalindrome(string &s){for (int i = 0, j = s.length()-1; i < j; i++, j--){if (s[i] != s[j]) return false;}return true;}


//2014-2-18 updatevector<vector<string> > partition(string s) {vector<vector<bool> > table(s.length(), vector<bool>(s.length(), true));genTable(table, s);vector<vector<string> > rs;vector<string> tmp;part(rs, tmp, table, s);return rs;}void part(vector<vector<string> > &rs, vector<string> &tmp, vector<vector<bool> > &table, string &s, int start=0){if (start == s.length()){rs.push_back(tmp);return;}for (int d = 1; d <= s.length()-start; d++){if (table[start][start+d-1]){tmp.push_back(s.substr(start, d));part(rs, tmp, table, s, start+d);tmp.pop_back();}}}void genTable(vector<vector<bool> > &table, string &s){for (int d = 2; d <= s.length(); d++){for (int i = 0, j = d - 1; j < s.length(); i++, j++){table[i][j] = (table[i+1][j-1] && s[i] == s[j]);}}}






2 0