输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。C++
2018-03-19 14:22
459 查看
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。求字符串全排列可以利用递归(深度优先搜索)、非递归两种;采用递归求解全排列需要注意的一点是需处理字符串中重复元素出现的情况;我这里采用非递归的方式,这样可以很好的处理重复元素的问题。思路分为三个步骤:
1、从后往前查找第一个值下降的元素位置;bafec
2、从后往前找比第一个下降值大且最小的元素位置;bafec
3、将以上两个步骤的元素互换;bcfea
4、再将第一个值下降元素后的元素进行递增排序;bcaef
循环上述4个步骤,就能够从最小排列遍历值最大排列;这道题是对字符串进行排列不那么直观,如果换成整数的话,会更容易掌握规律,大家可以自己试着推一下,具体细节看代码:
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> result;
if (str.length() == 0)
{
return result;
}
else if (str.length() == 1)
{
result.push_back(str);
return result;
}
bool flag = true;
result.push_back(str);
while (flag)
{
int i = 0;
int j = str.length() - 1;
//从后往后找,找到局部最大的值所在为位置
while (str[j] <= str[j - 1])
{
j--;
if (j == 0)
{
break;
}
}
if (j == 0)
{
break;
}
//
int k = str.length() - 1;
while (k >= j)
{
if (str[k] > str[j - 1])
{
break;
}
else
{
k--;
}
}
//交换
char c = str[k];
str[k] = str[j - 1];
str[j - 1] = c;
//将后半部分递减的字串,转为递增字串
swap_sort(str, j, str.length() - 1);
result.push_back(str);
}
return result;
}
void swap_sort(string &s, int start, int end)
{
int i = start;
int j = end;
while (i < j)
{
char c = s[i];
s[i++] = s[j];
s[j--] = c;
}
}
};
相关文章推荐
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
- 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
- 输入一个字符串,要求输出字符串中字符所有的排列,例如输入"abc",得到"abc","acb","bca","bac","cab","cba"
- 写一个函数,输出字符串中字符的所有排序。(比如:abc acb bac bca cab cba )
- 《牛客网剑指offer27题》输入一个字符串,按字典序打印出该字符串中字符的所有排列
- 写正确函数需要注意的地方:输入一个字符串,打印出该字符串中字符的所有排列
- 输入一个字符串,打印出该字符串中字符的所有排列
- 从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt
- java 输入一个字符串,打印出该字符串中字符的所有排列
- 字符 A、B、C 的所有组合(ABC、ACB、BAC、BCA、CAB、CBA)
- java 输入一个字符串,打印出该字符串中字符的所有排列
- 输入一个字符串,打印出该字符串中字符的所有排列
- 将字符串“abc”全排列成:abc、acb、bac、bca、cab、cba
- 输入一个字符串,打印出该字符串中字符的所有排列
- 输入一个字符串,打印出该字符串中字符的所有排列
- 输入一个字符串,打印出该字符串中字符的所有排列
- 输入一个字符串,打印出该字符串中字符的所有排列。