字符串排列组合算法

第二个算法是我笔试题遇到的,当时没有做出来,在网上看到别人写的算法,感觉太精妙了,就在这里分享出来。

全排列

所谓全排列,就是打印出字符串中所有字符的所有排列。例如输入字符串abc,则打印出 a、b、c 所能排列出来的所有字符串 abcacbbacbcacabcba

#include<stdio.h>
#include<string.h>

static int number=0;

void Swap(char *a ,char *b)
{
	char temp = *a;
	*a = *b;
	*b = temp;
}

void AllRange(char* str,int start,int length)
{
	if(start == length-1)
	{
		printf("%s\n",str);
		number++;
	}
	else
	{
		for(int i=start;i<=length-1;i++)
		{
			Swap(&str[start],&str[i]);
			AllRange(str,start+1,length);
			Swap(&str[start],&str[i]);
		}
	}
}

void Permutation(char* str)
{
	if(str == NULL)
		return;

	AllRange(str,0,strlen(str));
}

void main()
{
	char str[] = "abcde";
	Permutation(str);
	printf("number=%d\n",number);

}

全组合

如果不是求字符的所有排列,而是求字符的所有组合应该怎么办呢?还是输入三个字符 a、b、c,则它们的组合有a b c ab ac bc abc。当然我们还是可以借鉴全排列的思路,利用问题分解的思路,最终用递归解决。不过这里介绍一种比较巧妙的思路 —— 基于位图。

假设原有元素 n 个,则最终组合结果是 2n?1 个。我们可以用位操作方法:假设元素原本有:a,b,c 三个,则 1 表示取该元素,0 表示不取。故取a则是001,取ab则是011。所以一共三位,每个位上有两个选择 0 和 1。而000没有意义,所以是2n?1个结果。

这些结果的位图值都是 1,2…2^n-1。所以从值 1 到值 2n?1 依次输出结果:

001,010,011,100,101,110,111 。对应输出组合结果为:a,b,ab,c,ac,bc,abc
因此可以循环 1~2^n-1,然后输出对应代表的组合即可。有代码如下:

#include<stdio.h>
#include<string.h>

static int number=0;

void Combination(char *str)
{
	if(str == NULL)
		return ;
	int len = strlen(str);
	int n = 1<<len;
	printf("n=%d\n",n);
	for(int i=1;i<n;i++)    //从 1 循环到 2^len -1
	{
		for(int j=0;j<len;j++)
		{
			int temp = i;
			if(temp & (1<<j))   //对应位上为1,则输出对应的字符
			{
				printf("%c",*(str+j));
			}
		}
		number++;
		printf("\n");
	}
}

void main()
{
	char str[] = "abcdef";
	Combination(str);
	printf("number:%d\n",number);
}

反转字符串

main.c

#include<stdio.h>
#include<string.h>

void print(char *str)
{
   if(*str!=‘\0‘)  print(str+1);
   if(*str!=‘\0‘) 

printf("%c",*str);
}

int main(int argc,char **argv)
{
	char *buff="hello world";
	print(buff);
	printf("\n");
	return 0;
}
时间: 2024-10-14 05:19:35

字符串排列组合算法的相关文章

c# 排列组合算法

//排列组合 public class FullArrange { /// <summary> /// 排列组合 /// </summary> /// <param name="str">字符串</param> /// <param name="splitStr">分割的符号,比如";"</param> /// <returns></returns>

字符串排列组合问题

一.全排列无重复字符 #include<stdio.h> #include<string.h> char buf[1024]; void func(int index); void swap(int index1,int index2); int main() { memset(buf,0,sizeof(buf)); sprintf(buf,"abc"); func(0); return 0; } void func(int index) { if(index

java排列组合算法代码实现

原文:java排列组合算法代码实现 源代码下载地址:http://www.zuidaima.com/share/1550463479024640.htm java排列组合算法,有需要研究的童鞋可以下载,运行结果如下: package com.zuidaima.test; /** *@author www.zuidaima.com **/ public class Pailie { public static void main(String[] args) { int[] ia = {1, 2,

排列组合算法

实现组合算法C(n,k),可以用递归实现: python代码: 1 import copy #实现list的深复制 2 3 def combine(lst, l): 4 result = [] 5 tmp = [0]*l 6 length = len(lst) 7 def next_num(li=0, ni=0): 8 if ni == l: 9 result.append(copy.copy(tmp)) 10 return 11 for lj in range(li,length): 12 t

c语言中一种典型的排列组合算法

c语言中的全排列算法和组合数算法在实际问题中应用非常之广,但算法有许许多多,而我个人认为方法不必记太多,最好只记熟一种即可,一招鲜亦可吃遍天 全排列: #include<stdio.h> void swap(int *p1,int *p2) { int t=*p1; *p1=*p2; *p2=t; } void permutation(int a[],int index,int size) { if(index==size) { for(int i=0;i<size;i++) print

字符串排列组合

输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 结果请按字母顺序输出. <?php class Test{ /** * arr 元素数组, * m 从arr 中选择的元素个数 * isRepeat arr中的元素是否可以重复(默认重复) * b 中间变量 * n 等于第一次调用时的 m * res 存放结果 */ public static function combi

打印任意字符串排列组合

#include <iostream>#include <string> using namespace std; void swap(string& s,int i,int j){ char a = s[i]; s[i] = s[j]; s[j] = a;} void myPrint(string& s, size_t index){ if (index >= s.size()) { cout << s << endl; return

python 实现排列组合

1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库 #_*_ coding:utf-8 _*_ #__author__='dragon' import itertools list1 = [1,2,3,4,5] list2 = [] for i in range(1,len(list1)+1): iter = itertools.combinations(list1,i) list2.append(list(ite

POJ 3421 X-factor Chains (因式分解+排列组合)

题意:一条整数链,要求相邻两数前一个整除后一个.给出链尾的数,求链的最大长度以及满足最大长度的不同链的数量. 类型:因式分解+排列组合 算法:因式分解的素因子个数即为链长,链中后一个数等于前一个数乘以某素因子,所以链的数量即为这些因子不全相异的全排列数:A!/(a1!a2!a3!..) #include <cstdio> #include <cmath> #include <iostream> using namespace std; typedef long long