1 条题解

  • 0
    @ 2026-1-31 18:31:03
    #include <iostream>
    #include <string>
    using namespace std;
    
    string s;        // 输入的原始字符串(升序,保证字典序输出)
    string res;      // 存储当前生成的排列,按位置赋值实现回溯
    bool vis[10];    // 标记数组,vis[i]=true表示s[i]已被使用
    
    // [1] 深度优先搜索函数,pos表示当前要填充排列的第pos个位置
    void dfs(int pos) {
        // 递归终止条件:填充完所有位置,生成完整排列
        if (pos == s.size()) {
            cout << res << endl;
            return;
        }
    
        // [2] 遍历所有字符,尝试选择未使用的字符填充当前位置
        for (int i = 0; i < s.size(); i++) {
            // 跳过已被使用的字符
            if (!vis[i]) {
                vis[i] = true;        // 标记字符为已使用
                res[pos] = s[i];      // 直接给第pos位赋值,替代res+=s[i]
                dfs(pos + 1);         // 递归填充下一个位置
                // [3] 回溯:仅恢复标记,无需删除字符(下一次赋值会直接覆盖当前pos位)
                vis[i] = false;
            }
        }
    }
    
    int main() {
        cin >> s;
        res.resize(s.size());  // 初始化res长度与原字符串一致,保证pos索引有效
        dfs(0);                // 从第0个位置开始深搜生成排列
        return 0;
    }
    
    • 1

    信息

    ID
    1276
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者