字符串的排列

题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。

思路:

我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符b、a的排列。
 典型递归求解。

void pemutation(char *pStr)
{
	if (pStr==NULL)
	{
		return;
	}
	pemutation(pStr,pStr);
}

//求一个字符串某个区间内字符的全排列,pStr为字符串,pBegin为开始位置
void pemutation(char *pStr, char *pBegin)
{
	if (*pBegin=='\0')
	{
		//打印出字符串
		printf("%s\n",pStr);
	}
	else
	{
		for (char *pCh=pBegin; *pCh!='\0'; pCh++)
		{
			//交换
			char temp=*pCh;
			*pCh=*pBegin;
			*pBegin=temp;
			//递归
			pemutation(pStr,pBegin+1);
			//恢复
			temp=*pCh;
			*pCh=*pBegin;
			*pBegin=temp;
		}
	}
}
时间: 2024-12-28 01:31:49

字符串的排列的相关文章

【剑指offer】字符串的排列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26390551 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个测试案例包括1行. 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出: 对应每组数据,按字典序输出所有排列. 样例输入: abc BCA 样例输出:

字符串的排列-剑指Offer

字符串的排列 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母顺序输出. 输入描述 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 思路 把字符串分成两部分,一部分是第一个字符,另一个部分是后面其余的字符串 拿第一个字符和后面的字符串依次交换,这是一个递归的过程 注意:在递归里第一次交换是自身和自身的交换,保证不缺少字符串

剑指offer系列源码-字符串的排列

题目1369:字符串的排列 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2432解决:609 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个测试案例包括1行. 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出: 对应每组数据,按字典序输出所有排列. 样例输入: abc BCA 样例输出: abc acb ba

字符串的排列组合总结

问题1 :输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 思路:这是个递归求解的问题.递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环:(2)子问题在规模上比原问题小:(3)子问题可通过再次递归调用求解:(4)子问题的解应能组合成整个问题的解. 对于字符串的排列问题.如果能生成n - 1个元素的全排列,就能生成n个元素的全排列.对于只有1个元素的集合,可以直

编程算法 - 字符串的排列 代码(C)

字符串的排列 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个字符串, 打印出该字符串中字符的所有排列. 方法: 使用递归依次交换位置, 打印输出. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> void Permutation(char* pStr, char

【编程题目】字符串的排列(字符串)★

53.字符串的排列(字符串).题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串 abc,则输出由字符 a.b.c 所能排列出来的所有字符串abc.acb.bac.bca.cab 和 cba. 这道题花了我一天,要好好总结! 思路:这道题目感觉有些难,主要是字符串中的字符可能会有重复.我的想法是把一共有多少种字符和每种字符出现的次数统计出来,每个位置对这些字符变量,下一个位置的可用字符减小,再遍历. /* 53.字符串的排列(字符串). 题目:输入一个字符串,打印出该字符串中字

数据结构-字符串的排列

题目:输入 一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba 分析:这个题目完全不会.根据标案分析发现一些细节需要注意,char* 和char[]的区别. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

递归实现字符串反向排列

递归实现字符串反向排列决对不是一个好的方法,也不提倡这么去做.这里只是借助这个题深入的了解一下递归: 例:不使用库函数实现,递归实现字符串反向排列 #include<stdio.h> #include<stdlib.h> #include<assert.h> int my_strlen(char const *str) { assert(str); int len = 0; while (*str) { len++; str++; } return len; } cha

剑指Offer面试题28(java版):字符串的排列

题目:输入一个字符串,打印出该字符串中字符的所有排列. 例如输入字符串abc,则打印由字符a,b,c所能排列出来的所有字符串:abc,abc,bac,bca,cab,cba 我们求整个字符串的排列,可以看成两步:首先求出所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换.下图就是分别把第一个字符a和后面的b,c交换的情景.第二步固定第一个字符,求后面所有字符的排列.这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符.然后把第一个字符逐一和它

Leetcode 567.字符串的排列

字符串的排列 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: 输入: s1 = "ab" s2 = "eidbaooo" 输出: True 解释: s2 包含 s1 的排列之一 ("ba"). 示例2: 输入: s1= "ab" s2 = "eidboaoo" 输出: False 注意: 输入的字符串只包含小