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"] ]
Dynamic Programming.
I used vector<vector<string>> dp[s.size()] as dynamic programming array.
dp[i] stores all the possible palindrome partitioning of s[0] ~ s[i]. So dp[s.size()] is the value we need to return finally.
dp[i] = dp[j – 1] appends s[j] ~ s[i], if string s[j] ~ s[i] is palindrome., j = from 0 to i .
dp[-1] is empty.
class Solution { public: vector<vector<string>> partition(string s) { if(s.size() == 0) return vector<vector<string>>(); vector<vector<string>> dp[s.size()]; //base condition vector<string> vStr; vStr.push_back(s.substr(0, 1)); dp[0].push_back(vStr); //dynamic programmming for(size_t i = 1; i < s.size(); i++){ for(size_t j = i; j > 0; j--){ string tmps = s.substr(j, i - j + 1); if(isPalindrome(tmps)){ for(auto it = dp[j - 1].begin(); it != dp[j - 1].end(); it++){ //append character s[i] to dp[i - 1] vStr = *it; vStr.push_back(tmps); dp[i].push_back(vStr); } } } //j == 0 string tmps = s.substr(0, i + 1); if(isPalindrome(tmps)){ vStr.clear(); vStr.push_back(tmps); dp[i].push_back(vStr); } } return dp[s.size() - 1]; } bool isPalindrome(string s){ //o(n) //extreme case if(s.size() == 1) return true; int i, j; if(s.size() % 2 == 0){ //even i = s.size() / 2 - 1; j = i + 1; } else{ //odd i = s.size() / 2 - 1; j = i + 2; } while(i >= 0){ if(s[i] != s[j]) return false; i--; j++; } return true; } };