zoukankan      html  css  js  c++  java
  • 全排列问题

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

    这是一个典型的递归问题,考虑如何将复杂问题分解成简单问题,最后通过递归解决。我们肯定有这样的经验,自己在写abc的全排列的时候,肯定会想首先确定第一个字符,然后考虑后面有什么排列,比如确定第一个字符为a,那么剩下的b和c有两种排列,分别是bc和cb,那么以a开头的字符串有abc,acb这两种排列。这就是我们下面程序所需要用到的解题思路。

    1. 将字符串排列分解为字符串的第一个字符以及其后的剩余字符。剩余字符串又可以按照前面的思路来解决,分解为第一个字符和剩余字符串。当最后只有一个字符的时候,程序就到达出口,这个时候输出字符串,就是其中的一个排列。
    2. 字符串abc,那么可能出现在第一个字符的可能性有三种,我们只需要每次交互第一个字符,然后计算剩余字符串的排列即可。采用递归思路解决问题。

    代码实例:

    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    
    //交换元素值
    void Swap(char &a,char &b)
    {
    	char temp;
    	temp=a;
    	a=b;
    	b=temp;
    }
    
    //全排列函数
    void Permutation(char string[],int start,int end)
    {
    	if(start==end)
    	{
    		cout<<string<<endl;
    	}
    	else
    	{
    		for(int i=start;i<=end;i++)
    		{
    			Swap(string[i],string[start]);
    			Permutation(string,start+1,end);
    			Swap(string[i],string[start]);
    		}
    	}
    }
    
    void main()
    {
    	char string[]="abcd";
    	int len=strlen(string);
    	Permutation(string,0,len-1);
    	system("pause");
    }

  • 相关阅读:
    数字电路与系统-公式规则知识点
    数字电路与系统-门电路基本知识1
    数字电路与系统-数制与编码2
    数字电路与系统-数制与编码1
    数字电路与系统-知识点2
    数字电路与系统-知识点1
    数字电路与系统-编码器
    数字电路与系统-组合逻辑电路的竞争冒险现象3
    数字电路与系统-组合逻辑电路的竞争冒险现象2
    前端工程师提高工作效率的几个小技巧
  • 原文地址:https://www.cnblogs.com/byfei/p/3112176.html
Copyright © 2011-2022 走看看