题意大概就是输入一行小写字母,要求输出的全排列按字母表顺序且不重复。
思路是先给输入的字符串排序,然后用dfs。当dfs搜索到最长,向前递归时,加一个判断前一个字符是否与刚才的相同,相同则跳过,继续向前。
上代码
#include<stdio.h>
#include<string.h>
int n;
char a[207],flag[207],p[207];
void dfs(int step){
if(step>n-1){ //字符数组从0开始,所以n-1
printf("%s\n",p);
return ;
}
char last;
for(int i=0;i<n;i++){
if(!flag[i]&&a[i]!=last){
p[step]=a[i]; //p为最后打印数组
last=a[i]; //记录当前字符
flag[i]=1;
dfs(step+1);
flag[i]=0;
}
}
}
int main(){
gets(a);
n=strlen(a);
char temp;
for(int i=n-1;i>=0;i--){ //冒泡排序
for(int j=0;j<i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
dfs(0); //注意要从0开始
return 0;
}
该博客探讨了一种使用深度优先搜索(DFS)解决带重复字符的全排列问题的方法。首先对输入的字母字符串进行排序,然后通过递归实现DFS,当搜索到最长排列时,增加条件判断,如果前一字符与当前字符相同,则跳过,避免重复。通过这种方式,可以确保生成的所有排列都按字母顺序排列并且不重复。

2365

被折叠的 条评论
为什么被折叠?



