Split String

来源:互联网 发布:web在线考试系统源码 编辑:程序博客网 时间:2024/06/05 03:10

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);//恢复现场
            }
        }
    }
};