Split String
Give a string, you can choose to split the string after one character or two adjacent characters, and make the string to be composed of only one character or two characters. Output all possible results.
样例
Given the string "123"
return [["1","2","3"],["12","3"],["1","23"]]
一看这个问题就知道要使用回溯法遍历所有的可能,这也使我盲目的套用课件上的代码模板,直接编程序导致出现了各种小错误。
后来,经过仔细的思考按照回溯法的思路,找到了结束的条件,以及如何恢复现场。对于遍历时判断它是单独一个元素还是两个元素
就按照0,1规划问题的思路,分成两种情况就可以。
class Solution {
public:
/*
* @param : a string to be split
* @return: all possible split string array
*/
vector<vector<string>> a;
vector<string>b;
vector<vector<string>> splitString(string& s) {
// write your code here
if(s=="")
{
a.push_back(b);
return a;
}
backtrack(0,0,s);
if(s.size()>1)
backtrack(1,1,s);
return a;
}
void backtrack(int t,int n,string s)
{
if(t>=s.size())
{
return;
}
else{
if(n==0)
{
string c="";
c=c+s[t];
b.push_back(c);//if(t>=s.size()-1)
a.push_back(b);t++;
backtrack(t,0,s);t++;//这里之所以还需要加1是因为接下来要处理两个字母的情况
backtrack(t,1,s);
t=t-2;
b.erase(b.end()-1);//恢复现场
}
if(n==1)
{
string c="";
c=c+s[t-1]+s[t];
b.push_back(c);//if(t>=s.size()-1)
a.push_back(b);t++;
backtrack(t,0,s);t++;
backtrack(t,1,s);
t=t-2;
b.erase(b.end()-1);//恢复现场
}
}
}
};
public:
/*
* @param : a string to be split
* @return: all possible split string array
*/
vector<vector<string>> a;
vector<string>b;
vector<vector<string>> splitString(string& s) {
// write your code here
if(s=="")
{
a.push_back(b);
return a;
}
backtrack(0,0,s);
if(s.size()>1)
backtrack(1,1,s);
return a;
}
void backtrack(int t,int n,string s)
{
if(t>=s.size())
{
return;
}
else{
if(n==0)
{
string c="";
c=c+s[t];
b.push_back(c);//if(t>=s.size()-1)
a.push_back(b);t++;
backtrack(t,0,s);t++;//这里之所以还需要加1是因为接下来要处理两个字母的情况
backtrack(t,1,s);
t=t-2;
b.erase(b.end()-1);//恢复现场
}
if(n==1)
{
string c="";
c=c+s[t-1]+s[t];
b.push_back(c);//if(t>=s.size()-1)
a.push_back(b);t++;
backtrack(t,0,s);t++;
backtrack(t,1,s);
t=t-2;
b.erase(b.end()-1);//恢复现场
}
}
}
};