题解 | 字符串的排列

字符串的排列

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

#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return string字符串vector
     */
    void dfs(vector<string>& ans, string str, string& s, int pos, vector<bool>& vis){
        if(pos==str.size()){
            ans.push_back(s);
            return;
        }
        for(int i = 0; i < str.size(); ++i){
            if(vis[i]) continue;
            if(i>0&&!vis[i-1]&&str[i]==str[i-1]) continue;
            vis[i] = true;
            s[pos] = str[i];
            dfs(ans, str, s, pos+1, vis);
            vis[i] = false;
        }
    }
    vector<string> Permutation(string str) {
        // write code here
        sort(str.begin(), str.end());
        vector<string> ans;
        vector<bool> vis(str.size(), false);
        string s = str;
        dfs(ans, str, s, 0, vis);
        return ans;
    }
};

这种Ann的题很容易想到dfs,问题就在于怎么剪枝。

如果没有重复元素,直接每个都跑一遍,去掉前面(更浅层)已经出现过的元素就可以了。

本题的难处就在于有重复的时候,怎么让这个位置不跑重复的。

通过深度只能记录这一次有没有出现过这个元素,想要知道之前有没有相同的元素走过这里必须要外部数据结构记录。

一个很经典的做法是排序后记录前面的相同元素是否想要在这个位置用这个值,如果前面的相同元素在更浅的地方已经使用了,说明这次它不想要在这个位置用这个值,那么当前这个元素就可用。

如果前面相同元素没有出现过,那么它就可能想要这个值,因为按照我们的遍历顺序,它在str中排在当前元素前面,早就有机会使用这个位置,也就是这个位置只排这个值已经被遍历过了,所以不要再遍历,直接跳过。

时间复杂度是O(n*n!),空间复杂度是O(n*n!)。

全部评论

相关推荐

找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
点赞 评论 收藏
分享
但听说转正率很低,我现在有在实习了,好纠结要不要去
熬夜脱发码农:转正率低归低,但是实习的经历你可以拿着,又不是说秋招不准备了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务