当前位置: 代码迷 >> 综合 >> 剑指Offer JZ27 字符串的排列 C++实现
  详细解决方案

剑指Offer JZ27 字符串的排列 C++实现

热度:88   发布时间:2024-02-22 16:27:59.0

题目描述

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

输入描述:

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

解题思路


方法一:递归

1、思路:假设字符串长度为n,则字符串全排列的数目一共有种,首先固定字符串的第一位,一共有n种选择,然后固定第二位,有n-1种选择,因此可以递归的固定字符串的每一位,当固定到字符串的最后一位时开始回溯,用set可以自动对字符串的排列进行排序,还可以去除重复排列。

2、代码:

class Solution {
public:void perm (int pos, string str, set<string> &tmp) {if (pos + 1 == str.length()) {tmp.insert(str);return;}for (int i = pos; i < str.length(); i++) {swap(str[pos], str[i]);perm(pos + 1, str, tmp);swap(str[i], str[pos]);}}vector<string> Permutation(string str) {vector<string> result;if(str.empty()) return result;set<string> tmp;perm(0, str, tmp);result.assign(tmp.begin(), tmp.end());return result;}
};

3、复杂度:

时间复杂度:O(n!);

空间复杂度:O(n!),最多需要保存n!个排列。


方法二:字典序算法

  相关解决方案