将一个长字符串切割为所有回文字符串组合的DFS解法

题目描述

给定一个字符串s,分割s使得s的每一个子串都是回文串
返回所有的回文分割结果。(注意:返回结果的顺序需要和输入字符串中的字母顺序一致。)
 
示例

输入

"dde"

返回值

[["d","d","e"],["dd","e"]]


这是一道比较常规的dfs题目,
如要输出所有的解,往往深度优先搜索;
如要求出解的个数或最优解,往往动态规划。
那么此处就使用dfs来解。
思路大致这样,对长字符串分析,每次遇到的回文串推进字符串数组,然后对当前的字符串数组进行深度遍历,直到长字符串的结尾。
回文串的判定我发现有个大佬给了很简单的做法。
s == string(s.rbegin(), s.rend());
利用了一个反向迭代器,这样能一条语句就得到是否是回文字符,很方便,很巧妙。

题目比较简单,此处给出代码:


 1 class Solution {
 2 public:
 3     vector<vector<string> > partition(string s) {
 4         vector<vector<string>> res;
 5         vector<string> vec;
 6         dfs(res,vec,s);//这里开始dfs
 7         return res;
 8     }
 9     void dfs(vector<vector<string>> &res,vector<string> &vec,string s){
10         if(s.size()<1){res.push_back(vec);return;}
11         for(int i=1;i<=s.size();i++){//i是回文字符的长度 所以有个=判断
12             string str=s.substr(0,i);
13             if(str==string(str.rbegin(),str.rend())){//妙啊 回文判断太简单了
14                 vec.push_back(str);
15                 dfs(res,vec,s.substr(i));  //已经判断是回文的部分直接断开
16                 vec.pop_back();//dfs的回溯 其他分支的遍历需要退回一个当前元素
17             }
18         }
19     }
20 };

 



posted @ 2020-11-15 22:09  夜雨闻铃风声起  阅读(205)  评论(0)    收藏  举报