【剑指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

动态规划

posted @ 2022-11-18 21:02  啊原来是这样呀  阅读(23)  评论(0编辑  收藏  举报