zoukankan      html  css  js  c++  java
  • 【Data Structure & Algorithm】字符串全排列

    字符串全排列


    题目:输入一个字符串,打印出该字符串的所有排列。例如输入字符串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 Permutation(char *pStr, char *pBegin)
    {
    	///////////////////////////////////////////////////////////
    	// Get the permutation of a string,
    	// for example, input string abc, its permutation is
    	// abc acb bac bca cba cab
    	///////////////////////////////////////////////////////////
    	void Permutation(char *pStr)
    	{
    		Permutation(pStr, pStr);
    	}
    
    	///////////////////////////////////////////////////////////
    	// Print the permutation of a string, 
    	// Input: pStr     -input string
    	//        pBegin   -points to the begin char of string
    	//                  which we want to permutate in this recursion
    	////////////////////////////////////////////////////////////
    	void Permutation(char *pStr, char *pBegin)
    	{
    		if(!pStr || !pBegin)
    			return;
    		//if pBegin points to the end of string,
    		//this round of permutation is finished,
    		//print the permuted string
    		if(*pBegin == '')
    		{
    			printf("%s
    ", pStr);
    		}
    		//otherwise, permute string
    		else
    		{
    			for (char *pCh = pBegin; *pCh != ''; ++pCh)
    			{
    				//swap pCh and pBegin
    				char temp = *pCh;
    				*pCh = *pBegin;
    				*pBegin = temp;
    
    				Permutation(pStr, pBegin+1);
    
    				//restore pCh and pBegin
    				temp = *pCh;
    				*pCh = *pBegin;
    				*pBegin = temp;
    			}
    		}
    	}
    }
    


  • 相关阅读:
    《显示器件应用分析精粹》构思
    《三极管应用分析精粹》已经交稿
    leetcode
    mskitten
    如果IBM再给我一次实习机会
    “完美工作”是什么样子
    一起四十岁退休吧……
    未来公司的酒会
    热泪盈眶的五十岁 | James Altucher
    一个程序员的辞呈
  • 原文地址:https://www.cnblogs.com/DianaCody/p/5425704.html
Copyright © 2011-2022 走看看