题目描述:
方法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帖子