class Solution {
public:
bool IsPalindrome(string str, int startIdx, int endIdx)
{
while (startIdx < endIdx)
{
if(str[startIdx] != str[endIdx])
return false;
startIdx++;
endIdx--;
}
return true;
}
void DFS(string& str, int startIdx, vector<string>& curSubStrs, vector<vector<string>>& result)
{
if (startIdx == str.size())
{
result.push_back(curSubStrs);
return;
}
for (int i = startIdx; i < str.size(); ++i)
{
if ( IsPalindrome(str, startIdx, i) )
{
curSubStrs.push_back(str.substr(startIdx, i-startIdx+1));
DFS(str, i+1, curSubStrs, result);
curSubStrs.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<string> curSubStrs;
vector<vector<string>> result;
DFS(s, 0, curSubStrs, result);
return result;
}
};
second time
class Solution {
public:
void partitionUtil(string& s, vector<vector<bool> >& isP, int curIdx, vector<int>& curPath, vector<vector<string> >& allPath)
{
if(curIdx == s.size())
{
vector<string> curStr;
//
int end = s.size();
for(int i = curPath.size()-1; i >= 0; --i)
{
curStr.push_back(s.substr(curPath[i], end-curPath[i]));
end = curPath[i];
}
reverse(curStr.begin(), curStr.end());
allPath.push_back(curStr);
return;
}
for(int i = curIdx; i < s.size(); ++i)
{
if(isP[curIdx][i])
{
curPath.push_back(curIdx);
partitionUtil(s, isP, i+1, curPath, allPath);
curPath.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n = s.size();
vector<vector<bool> > isP(n, vector<bool>(n, false));
for(int i = n-1; i >= 0; --i)
{
for(int j = i; j < n; ++j)
{
if(s[i] == s[j]) isP[i][j] = (j-1 <= i+1) || isP[i+1][j-1];
}
}
vector<vector<string> > allPath;
vector<int> curPath;
partitionUtil(s, isP, 0, curPath, allPath);
return allPath;
}
};