zhouzhi1968 2020-06-16 21:53 采纳率: 0%
浏览 269
已采纳

剑指OFFER的一道关于全排列的题目,我这样写为何得到了正确的结果,感觉想了想挺不符合逻辑的。

题目:
图片说明
我刚开始的代码(能AC):

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> v;
        if(str.empty())
            return v;
        return permuta(v,str,0);
    }
    vector<string> permuta(vector<string> &v,string str,int n)
    {
        if(n==str.size())
            v.push_back(str);
        else
            {
                permuta(v,str,n+1);             
                for(int i=n+1;i<str.size();i++)  
                {    
                    if(str[i]!=str[n])           
                    {
                        swap(str[n],str[i]);
                        permuta(v,str,n+1);
                    }   
                }
            }         
            return v;
     }     
};

之后修改的代码,符合逻辑也能AC,想不通第一种为什么能直接实现全排列了

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> v;
        if(str.empty())
            return v;
        permuta(v,str,0);
        sort(v.begin(),v.end());   
        return v;
    }
    void permuta(vector<string> &v,string str,int n)
    {
        if(n==str.size())
            v.push_back(str);
        else
            {
                permuta(v,str,n+1);              
                for(int i=n+1;i<str.size();i++)  
                {    
                    if(str[i]!=str[n])           
                    {
                        swap(str[n],str[i]);
                        permuta(v,str,n+1);
                        swap(str[n],str[i]);     
                    }   
                }
            }         
    }   
};

VS2019中能直接测试的代码放在下面:

#include <bits/stdc++.h>
using namespace std;
vector<string> v;
vector<string> permuta(vector<string>& v, string str, int n);
    vector<string> Permutation(string str)
    {

     if (str.empty())
            return v;
        return permuta(v, str, 0);
    }
    vector<string> permuta(vector<string>& v, string str, int n)
    {
        if (n == str.size())
            v.push_back(str);
        else
        {
            permuta(v, str, n + 1);              
            for (int i = n + 1; i < str.size(); i++)  
            {
                if (str[i] != str[n])           
                {
                    swap(str[n], str[i]);
                    permuta(v, str, n + 1);
                    //swap(str[n], str[i]);     
                }
            }
        }
        return v;
    }
int main()
{
    Permutation("abcd");
    return 0;
}

为什么更少的代码也AC了

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-06-17 00:02
    关注

    string str每次调用都创建了一个新的副本
    你permuta(v, str, n + 1);之后没有再用到str,所以无需恢复

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作