题目描述:
给一个字符串,你可以选择在一个字符或两个相邻字符之后拆分字符串,使字符串由仅一个字符或两个字符组成,输出所有可能的结果
样例:
给一个字符串”123”
返回[[“1”,”2”,”3”],[“12”,”3”],[“1”,”23”]]
思路详解:我看到这道题就想到了用深度搜索,直接每次递归取字符,每次取的个数为一个或者两个,然后最后只要我们将整个字符串取完,我们就可以将其作为一种情况,将其添加进数组中,这里首先我是利用string来保存一种情况的,每一种情况中的每一部分用“-”分割开来。这样就避免了我们用数组时,还要删除的情况,因为个人感觉用vector数组删除很麻烦 所以就用了这种情况。
代码详解:
class Solution {
public:
/*
* @param : a string to be split
* @return: all possible split string array
*/
vector<vector<string>> splitString(string& s) {
// write your code here
vector<string>res;
vector<vector<string>>res_vec;
if(s.length()==0){
res_vec.push_back(res);
return res_vec;
}
string ss="";
dfs(res,ss,s,0);
sort(res.begin(),res.end());//去重
res.erase(unique(res.begin(),res.end()),res.end());
vector<vector<string>>vec(res.size());
for(int i=0;i<res.size();i++){
vec[i]=split(res[i],"-");//利用split函数将每一种情况分割出来。
}
return vec;
}
void dfs(vector<string>& res,string& s,string ss,int index){
if(index+1==ss.length()){//递归调用结束的出口
string tmp=ss.substr(index,1);
tmp=s+tmp;
res.push_back(tmp);
}else if(index+2==ss.length()){
string tmp1=ss.substr(index,1);
string tmp2=ss.substr(index+1,1);
string tmp3=ss.substr(index,2);
res.push_back(s+tmp1+"-"+tmp2);
res.push_back(s+tmp3);
}
for(int i=0;i<2;i++){
if(i==0){
if(index+1<=ss.length()){//只拿一个字符的情况
string tmp=ss.substr(index,1);
string ls=s+tmp+"-";
dfs(res,ls,ss,index+1);
}
}else{
if(index+2<=ss.length()){//只拿二个字符的情况
string tmp=ss.substr(index,2);
string ls=s+tmp+"-";
dfs(res,ls,ss,index+2);
}
}
}
}
void printvector_str(vector<string>res){
for(int i=0;i<res.size();i++){
cout<<res[i]<<" ";
}
cout<<endl;
}
};