含有重复字符的字符串的全排列

输入一个字符串,里面可能含有重复字符,输出不相同的全排列,输出全排列的个数。

思路

首先对字符串进行排序,保证输出是按照字母序的。在非重复字符串全排列程序的循环体内,加上一句条件控制,如果不是自我交换的情况时,当前的字符和前一个字符相等,那么就跳过,直到不相等或字符串结束。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <cstdio>
#include <iostream>
using namespace std;
void string_permutation_core(char *str, char *ptr, int &count)
{
if (*ptr == '\0')
{
printf("%s\n", str);
++count;
}
for (char *temp = ptr; *temp != '\0'; ++temp)
{
//如果不是自我交换,那么就检查当前字符是不是和前一个字符相等,是的话就跳过
// 这样保证了连续重复的字符串只出现一次
if (temp > ptr && *temp == *(temp - 1))
continue;
swap(*ptr, *temp);
string_permutation_core(str, ptr + 1, count);
swap(*ptr, *temp);
}
}
int string_permutation(char *str)
{
if (str == NULL)
return 0;
printf("result:\n");
int count = 0;
//如果要求按照字符序输出,先进行排序
std::sort(str, str + strlen(str));
string_permutation_core(str, str, count);
printf("count:%d\n", count);
return count;
}
int main(){
char buffer[256];
while (cin.getline(buffer, 256))
string_permutation(buffer);
return 0;
}
坚持原创技术分享,您的支持将鼓励我继续创作!