• 剑指offer——40字符串的排列


    题目描述

    输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

    输入描述:

    输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。


    题解:

      一种交换的递归,一种DFS

        交换法,是将i前半部分与i的后半部分交换,得到新的排列组合

        DFS,是使用一种选择字符串的顺序重新组成一个新的数组

      两种方法要用set存储来达到去重的效果,因为字符串中存在重复的字母

      

     1 class Solution01 {
     2 public:
     3     vector<string> Permutation(string str) {
     4         if (str.size() == 0)return {};
     5         set<string>res;
     6         DFS(str, 0, res);
     7         vector<string>resV;
     8         resV.assign(res.begin(), res.end());
     9         return resV;
    10     }
    11     void DFS(string str, int index, set<string>&res)
    12     {
    13         if (index >= str.length())
    14             res.insert(str);
    15         for (int i = index; i < str.length(); ++i)
    16         {
    17             swap(str[i], str[index]);
    18             DFS(str, index + 1, res);
    19             swap(str[i], str[index]);
    20         }
    21     }
    22 };
    23 
    24 class Solution02 {
    25 public:
    26     vector<string> Permutation(string str) {
    27         if (str.size() == 0)return {};
    28         set<string>res;
    29         string s = "";
    30         vector<bool>v(str.length(), false);
    31         DFS(str, s, v, res);
    32         vector<string>resV;
    33         resV.assign(res.begin(), res.end());
    34         return resV;
    35     }
    36     void DFS(const string str,string s, vector<bool>&v,set<string>&res)
    37     {
    38         if (s.length() == str.length())
    39         {
    40             res.insert(s);
    41             return;
    42         }        
    43         for (int i = 0; i < str.length(); ++i)
    44         {
    45             if (v[i] == false)
    46             {
    47                 v[i] = true;
    48                 s += str[i];
    49                 DFS(str,s, v, res);
    50                 s.erase(s.length() - 1);
    51                 v[i] = false;
    52             }
    53         }
    54     }
    55 };

      

  • 相关阅读:
    ExIco应用程序图标保存器1.0发布
    Object.defineProperty
    es6代理 proxy 学习
    node js学习记录
    css默认值列表
    关于 keyup keydown keypress
    转载一篇关于css选择器的,很透彻
    ......图片上传
    mimi
    css 开发心得
  • 原文地址:https://www.cnblogs.com/zzw1024/p/11688736.html
Copyright © 2020-2023  润新知