题目描述:

方法1:回溯

class Solution {
public:
    vector<string> data;
    vector<vector<string>> result;
    int Slength;//初始字符串长度,用于判断是否遍历完初始s

    //判断一个字符串是否是回文串
    bool judge(string s){
        string s1 = string(s.rbegin(),s.rend());//反转字符串
        if(s1 == s) return true;
        return false;
    }

    void backtrack(string s,int len){
        if(len == Slength){ //初始s已经遍历完
            result.push_back(data);
            return;
        }

        for(int i=1;i<=s.size();i++){
            string s1 = s.substr(0,i);
            if(judge(s1)){
                data.push_back(s1);
                len += s1.size();
                backtrack(s.substr(i),len);  //substr第二个参数会默认到结尾
                len -= s1.size();
                data.pop_back();
            }
            else continue;
        }
    }

    vector<vector<string>> partition(string s) {
        Slength = s.size();
        backtrack(s,0);
        return result;
    }
};

但是其实有小问题,s.substr(i),假设只有一个字母,第一次循环中s.substr(1)其实是会抛出 std::out_of_range 异常,不知道为啥leetcode没抛出,可以改为s.substr(0+i)避免异常,原因可见博客中string帖子