JZ38-题解 | #字符串的排列#

字符串的排列

http://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7

题目描述


输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

alt


题解

图示引自:NumPy

alt

代码

void permutation(int pos, string str, set<string>& s) {
    //递归出口
    if (pos + 1 == str.length()) {//当
        s.insert(str);
        return;
    }
    // for循环和swap的含义:对于“ABC”,
    // 第一次'A' 与 'A'交换,字符串为"ABC", pos为0, 相当于固定'A'
    // 第二次'A' 与 'B'交换,字符串为"BAC", pos为0, 相当于固定'B'
    // 第三次'A' 与 'C'交换,字符串为"CBA", pos为0, 相当于固定'C'
    for (int i = pos; i < str.length(); i++) {
        swap(str[pos], str[i]);
        permutation(pos + 1, str, s);
        swap(str[pos], str[i]);
        // 回溯的原因:比如第二次交换后是"BAC",需要回溯到"ABC"
        // 然后进行第三次交换,才能得到"CBA"
    }
}
vector<string> Permutation(string str) {
    if (str.size() == 0) return {};
    set<string> s;
    permutation(0, str, s);
    vector<string> v;
    for (set<string>::iterator it = s.begin(); it != s.end(); it++) {
        v.push_back((*it));
    }
    return v;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务