多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【剑指offer】39.字符串的排列

总目录:

算法之旅导航目录

 

1.问题描述

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
数据范围:n<10
要求:空间复杂度 O(n!),时间复杂度 O(n!)

 

2.问题分析

1递归+回溯,注意这种一个序列中元素进行全排列组合的方式,逐个固定、迭代后续的套路,有点像层序遍历

 

 

 

2动态规划


3.代码实例

递归+回溯

复制代码
 1 class Solution {
 2 public:
 3     void perm(int pos, string s, set<string> &ret) {
 4         if (pos+1 == s.length()) {
 5             ret.insert(s);
 6             return;
 7         }
 8         // for循环和swap的含义:对于“ABC”,
 9         // 第一次'A' 与 'A'交换,字符串为"ABC", pos为0, 相当于固定'A'
10         // 第二次'A' 与 'B'交换,字符串为"BAC", pos为0, 相当于固定'B'
11         // 第三次'A' 与 'C'交换,字符串为"CBA", pos为0, 相当于固定'C'
12         for (int i = pos; i < s.length(); ++i) {
13             swap(s[pos], s[i]);
14             perm(pos+1, s, ret);
15             swap(s[pos], s[i]);
16             // 回溯的原因:比如第二次交换后是"BAC",需要回溯到"ABC"
17             // 然后进行第三次交换,才能得到"CBA"
18         }
19     }
20     vector<string> Permutation(string s) { 
21         if (s.empty()) return {};
22         set<string> ret;
23         perm(0, s, ret);
24         return vector<string>({ret.begin(), ret.end()});
25     }
26 };
View Code
复制代码

动态规划

本文作者:OhOfCourse

本文链接:https://www.cnblogs.com/OhOfCourse/p/16904900.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(24)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起