用你熟悉的编程语言,设计如下功能的函数:输入一个字符串,输出该字符串中所有字母的全排列。程序请适当添加注释。
C++函数原型:
void Print(const char *str)
输入样例: abc
输出结果:
abc、acb、bca、bac、cab、cba
public class Main {
public static void main(String[] args) {
char[] a = { 'a', 'b', 'c' };
perm(a, 0, 2);
}
public static void swap(char[] str, int a, int b) {
char tmp = str[a];
str[a] = str[b];
str[b] = tmp;
}
public static void perm(char[] str, int begin, int end) {
if (begin == end) {
for (char ch : str)
System.out.print(ch);
System.out.print('\n');
} else
for (int i = begin; i <= end; i++) {
swap(str, begin, i);
perm(str, begin + 1, end);
swap(str, begin, i);
}
}
}
//递归法
#include<iostream>
#include<cstring>
using namespace std;
void Curse(char *str, int start, int end)
{
if(start >= end)
{
cout << str << " ";
return;
}
for(int i = start; i <= end; i++)
{
char temp = str[start];
str[start] = str[i];
str[i] = temp;
Curse(str, start+1, end);
temp = str[start];
str[start] = str[i];
str[i] = temp;
}
}
void Print(const char *str)
{
int len = strlen(str);
if(len <= 1)
{
cout << *str << endl;
return;
}
char* newstr = new char[len+1];
strcpy(newstr, str);
Curse(newstr, 0, len-1);
}
int main()
{
char *str = new char[256];
while(cin >> str)
{
cout << "ok" << endl;
Print(str);
cout << endl;
}
return 0;
}
关键是全排函数的实现,我使用的是void permu(string used, string remain);
每次调用,都把remain中的每一位添加在used之后,然后将remain重新组合(即去掉加到used里去的那个元素后),重新调用,直到remain里所有元素都加到used里,表示一次排列完成。用for循环将所有情况全部排列
string cstring2string(const char *str) //把char* 变成string { string s; int i = 0; while (*str) s += *(str++); return s; } void permu(string used, string remain) //全排列函数,递归思想 { if (remain.empty()) cout << used << endl; //如果remain空了,说明排列完毕,则将used输出 for (int i = 0; i < remain.size(); i++) permu(used + remain[i], remain.substr(0, i) + remain.substr(i + 1)); } void Print(const char *str) { string used, remain = cstring2string(str); permu(used, remain); }