パリンドローム単語が分割されることに注意してください、文字列が回文大きな文字列であるかどうかを判断するためではありません
一般的な考え方:
DFSはうまく行きました。
・小さな結論を参照してください。出力はすべての可能な解決策を必要に応じて、多くの場合、深さ優先探索を使用しています。多くの場合、動的プログラミングを使用して、最適なソリューション、または溶液の数を確認する必要がある場合。
・非常に強力なポイントがあります:文字列リバースイテレータrbegin()とレンド() 、図を参照してください。
だから、文字列が回文であるかどうかを判断するために、ただ一つの文章:
return s == string(s.rbegin(),s.rend()); //看s的反向是不是等于s
*注:SUBSTR(起点、ストリングサブストリングの長さ)
ACコード:
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> res;
vector<string> cur;
dfs(res,cur,s);
return res;
}
void dfs(vector<vector<string>> &res, vector<string> &cur, string s)
{
if(s=="")
{
res.push_back(cur);
return;
}
for(int i=1;i<=s.size();i++)
{
string sub = s.substr(0,i);
if(isPalindrome(sub))
{
cur.push_back(sub);
dfs(res,cur,s.substr(i,s.size()-i));
cur.pop_back(); //pop_back是移除vector最后一个元素,也就是移除这里加入的sub
}
}
}
bool isPalindrome(string s)
{
return s == string(s.rbegin(),s.rend());
}
};