首页 > 试题广场 >

用你熟悉的编程语言,设计如下功能的函数:输入一个字符串,输出

[问答题]

用你熟悉的编程语言,设计如下功能的函数:输入一个字符串,输出该字符串中所有字母的全排列。程序请适当添加注释。
C++函数原型: void Print(const char *str)
输入样例: abc
输出结果: abc、acb、bca、bac、cab、cba

推荐
因为c++里string使用起来更为方便,所以添加了一个函数把const char *str变成string
关键是全排函数的实现,我使用的是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);
}


编辑于 2015-02-09 15:19:27 回复(1)
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);
			}
	}
}

发表于 2017-03-24 00:37:38 回复(0)
//递归法
#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;
} 

发表于 2016-09-25 13:51:22 回复(0)