字符串排列、组合(C语言实现)
来源:互联网 发布:南开大学 出国 知乎 编辑:程序博客网 时间:2024/05/18 00:57
这里主要介绍字符串排列组合问题,高中数学常见的题目,不用详细介绍,看例子就可以解决问题
"1212"
全排列结果为 1212,1221,1122,2112,2121,2211
组合结果是 1,2,12
我所理解的排列组合结果是 1,2,12,21
解决方案:主要是利用递归思想
排列问题:求n个字符排列问题简化求n-1个字符排列问题,逐层递归到1个字符。有n个字符的序列第一个字符与后面每一个前面没有重复的字符交换,避免了重复序列,然后求n-1个字符全排列 f(char *s, int index,int len)index为第一个下标,len是s总长度
组合问题:先按照递增排序,然后挑出无重复的元素存于另一个字符串,依次从字符串挑选1..n个字符,递归选择字符串 combine(char *s, char *re,int len, int num)
全排列代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define swap(a,b,c) (c)=(a),(a)=(b),(b)=(c)
void
permutation(
char
s[],
int
b,
int
len)
// 长度为len的字符串,从s[i]开始全排列
{
char
c;
if
(b==len)
//等价于 if(s[b]=='\0')
printf
(
"%s\n"
,s);
if
(b<len)
for
(
int
i=b; i<len; i++)
{
int
f=0;
for
(
int
j=i-1;j>=b; j--)
//遍历查询前面有没有出现该字符
if
(s[j]==s[i])
{
f=1;
break
;
}
if
( f==1 )
continue
;
//跳过
swap (*(s+b),*(s+i),c );
//交换
permutation(s,b+1,len);
//从s[b+1]开始全排列
swap(*(s+b),*(s+i),c);
//返回原来字符串顺序
}
return
;
}
int
main()
{
char
s[]=
"1212"
;
int
len=
strlen
(s);
permutation(s,0,len);
system
(
"pause"
);
return
0;
}
组合代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<iostream>
using
namespace
std;
#define swap(a,b,c) (c)=(a),(a)=(b),(b)=(c)
void
combine(
char
*s,
char
*re,
int
len,
int
num)
//len长度的字符串s 选取num个字符自由组合存放到字符串re
{
if
(num==0)
//判断是否完成任务,不再需要选取字符
{
printf
(
"%s\n"
,re);
return
;
}
if
(len>=num)
{
combine(s,re,len-1,num);
//不选取s[len-1]
re[num-1]=s[len-1];
//选取s[len-1]
combine(s,re,len-1,num-1);
}
return
;
}
int
cmp (
const
void
*a,
const
void
*b)
{
return
*(
char
*)a-*(
char
*)b;
}
int
main()
{
int
len,i,j,k;
char
s[100],d[100],re[100];
while
(
scanf
(
"%s"
,s)!=EOF)
{
len=
strlen
(s);
qsort
(s,len,
sizeof
(
char
),cmp);
//s字符串递增排序
d[0]=s[0];
for
(i=1,j=1; i<len; i++)
//挑选出s中独一无二的字符 存到d
if
(s[i]!=s[i-1])d[j++]=s[i];
d[j]=
'\0'
;
for
(i=1;i<=j;i++)
{
re[i]=
'\0'
,combine(d,re,j,i);
}
}
}
- 字符串排列、组合(C语言实现)
- C语言实现排列/组合算法
- c 语言实现全排列和组合
- 字符串全排列 C语言实现
- C语言实现全排列(部分算法参考网友,可实现重复字符的组合)
- 排列和组合算法 C语言经典实现
- 排列和组合算法 C语言经典实现
- C语言实现数学上的组合和排列
- 字符串的排列和组合实现(面试题 28)
- 字符串排列和组合的JAVA实现
- 全排列 (C语言实现)
- C语言实现:输入字符串的全部组合
- 排列和组合的非递归算法的C语言实现
- 排列和组合的非递归算法的C语言实现
- 全排列C语言实现
- C语言实现全排列
- C语言实现全排列
- C语言实现全排列
- hosts更新 2013.8.17
- 杂谈:手游市场在浮动
- Java基础<六>---> 面向对象与java特性(封装、继承、多态
- AOP编程之JDK动态代理和Cglib动态代理
- 编程经验点滴积累
- 字符串排列、组合(C语言实现)
- iBATIS入门介绍和SQL的转义字符及mysql 约束相关知识
- 【python】利用sftp及rsa密匙实现远程拷贝文件
- log日志框架和LocationAwareLogger问题
- 基础学习总结之正则表达式
- extjs combobox下拉框 联动
- 每天写出好代码的5个建议
- 飘逸的python - 字典合并值相加
- Hadoop运行的job作业的时候有具体十个步骤(能力工场--整理)