zoukankan      html  css  js  c++  java
  • 【LeetCode-回溯】字符串的排列

    题目描述

    输入一个字符串,打印出该字符串中字符的所有排列。
    你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
    示例:

    输入:s = "abc"
    输出:["abc","acb","bac","bca","cab","cba"]
    

    说明: 1 <= s 的长度 <= 8
    题目链接: https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/

    思路

    使用回溯来做。一般使用回溯来做每一层搜索的起点 start 都是根据上一层得到的。在求全排列问题时,每一次都是从头开始,也就是从下标 0 开始搜索。同时使用 visit 数组标记在本轮搜索中位置 i 是否已经被添加到答案当中去了。

    代码如下:

    class Solution {
    public:
        vector<string> permutation(string s) {
            if(s.empty()) return {};
    
            vector<string> ans;
            unordered_set<string> lookup; // 用来去重
            int start = 0;  // 搜索开始的位置
            string cur = "";
            vector<bool> visit(s.size(), false);
            dfs(s, start, cur, visit, lookup, ans);
            return ans;
        }
    
        void dfs(string& s, int start, string cur, vector<bool>& visit, unordered_set<string>& lookup, vector<string>& ans){
            if(cur.size()==s.size()){
                if(lookup.count(cur)==0){
                    ans.push_back(cur);
                    lookup.insert(cur);
                }
                return;
            }
    
            for(int i=0; i<s.size(); i++){
                if(!visit[i]){
                    cur += s[i];
                    visit[i] = true;    
                    dfs(s, i+1, cur, visit, lookup, ans);
                    visit[i] = false;
                    cur.pop_back();
                }
            }
        }
    };
    

    上面的代码中,变量 start 不是必须的,因为没有用到这个变量,写在里面是为了和其他回溯的写法统一起来。

  • 相关阅读:
    HDU2546(01背包)
    HDU4283(KB22-G)
    POJ1651(KB-E)
    POJ2955(KB22-C 区间DP)
    POJ3264(KB7-G RMQ)
    POJ3468(KB7-C 线段树)
    POJ3616(KB12-R dp)
    Ubuntu16.04安装opencv for python/c++
    华中农业大学第五届程序设计大赛网络同步赛-L
    华中农业大学第五届程序设计大赛网络同步赛-K
  • 原文地址:https://www.cnblogs.com/flix/p/13374698.html
Copyright © 2011-2022 走看看