​BM58 字符串的排列​

知识点​字符串​​​​递归​

描述

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。[典型]BM58 字符串的排列-中等_递归

数据范围:[典型]BM58 字符串的排列-中等_递归_02

要求:空间复杂度 [典型]BM58 字符串的排列-中等_字符串_03,时间复杂度 [典型]BM58 字符串的排列-中等_字符串_03

输入描述:

输入一个字符串,长度不超过10,字符只包括大小写字母。

示例1

输入:

"ab"

复制返回值:

["ab","ba"]

复制说明:

返回["ba","ab"]也是正确的

示例2

输入:

"aab"

复制返回值:

["aab","aba","baa"]

复制

示例3

输入:

"abc"

复制返回值:

["abc","acb","bac","bca","cab","cba"]

复制

示例4

输入:

""

复制返回值:

[]


题解

该问题实际上和有重复元素的数组的全排列一样,具体分析可以参考​​[典型]BM56 有重复项数字的全排列-中等 ​

代码如下:

#include <bits/stdc++.h>

using namespace std;

// https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7?tpId=295&tqId=23291&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295
// BM58 字符串的排列

void perm_imp(std::string &str, std::vector<std::string> &res, std::string &tmp, std::vector<int> visited)
{
if (tmp.size() == str.size())
{
res.push_back(tmp);
return;
}

for (int i = 0; i < str.size(); ++i)
{
if (visited[i] == 1)
{
continue;
}

if (i > 0 && str[i - 1] == str[i] && visited[i - 1] == 1)
{
continue;
}
visited[i] = 1;
tmp.push_back(str[i]);
perm_imp(str, res, tmp, visited);
tmp.pop_back();
visited[i] = 0;
}
}

std::vector<std::string> Permutation(std::string str)
{
std::sort(str.begin(), str.end());
std::vector<std::string> res;
std::vector<int> visited(str.size(), 0);
std::string tmp;
perm_imp(str, res, tmp, visited);
return res;
}