lintcode----分割字符串

题目描述:
给一个字符串,你可以选择在一个字符或两个相邻字符之后拆分字符串,使字符串由仅一个字符或两个字符组成,输出所有可能的结果

样例:
给一个字符串”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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值