书上用的是char*
nowcoder中用的是string类型,并且加了两个点:
1.按字典序输出结果
解决:用vector自带的sort函数
2.可能有重复的字符
解决:交换时检测
自己敲了大概,这两点参考之前通过的代码加上的。基本顺利通过
小问题:把!= 写成了!==
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> result;
int length = str.size();
if(length < 1) return result;
Permutation(str, length, result, 0);
sort(result.begin(), result.end()); // 字典序
return result;
}
void Permutation(string str, int length, vector<string>& result, int current) {
if(current == length-1) {
result.push_back(str);
} else {
for(int i=current; i<length; i++) {
if(i!=current && str[i]==str[current]) { // 处理重复
continue;
}
swap(str[current], str[i]);
Permutation(str, length, result, current+1);
}
}
}
};
另外,书上用指针,涉及到交换字符,调用递归后要要还原本次交换,以便与下一个交换。
而我直觉觉得string可能是值传递而不是引用传递,不需要做这一步,大胆尝试之后果然是这样。第一次通过的代码有一步是不必要的。
刚好上午看了java的传参。看来扎实的基础需要点滴积累,实践理论结合
本题题眼是把排列组合问题转化为编程思维:第一个字符与其后的每个字符交换,轮流当第一;
再利用递归,就出来了。