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 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了