字符串排列组合算法
来源:互联网 发布:电脑看电影的软件 编辑:程序博客网 时间:2024/06/05 16:05
第二个算法是我笔试题遇到的,当时没有做出来,在网上看到别人写的算法,感觉太精妙了,就在这里分享出来。
全排列
所谓全排列,就是打印出字符串中所有字符的所有排列。例如输入字符串abc
,则打印出 a、b、c 所能排列出来的所有字符串 abc
、acb
、bac
、bca
、cab
和 cba
。
#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 个,则最终组合结果是 a
则是001
,取ab
则是011
。所以一共三位,每个位上有两个选择 0 和 1。而000
没有意义,所以是
这些结果的位图值都是 1,2…2^n-1。所以从值 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;}
1 0
- 字符串排列组合算法
- 一道字符串排列组合算法题
- 字符串的排列组合算法合集
- 字符串排列组合问题&递归算法(1)
- 字符串排列组合问题&递归算法(2)
- 字符串排列组合
- 字符串排列组合
- 字符串排列组合
- 字符串排列组合
- 字符串排列组合
- 字符串排列组合
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- 排列组合算法
- sublime ( 快捷键 Ctrl+B 使用‘build’ )调用python 控制台运行python脚本无反应/空白 (UnicodeDecodeError)
- 一个非科班17届毕业生的求职互联网经历(腾讯、美团、携程等)
- Android心得4.3--SQLite数据库--execSQL()和rawQuery()方法
- PSVR即将发售了,还不准备买买买?
- CSDN爬虫(四)——博客专家(所有)爬取+数据分析
- 字符串排列组合算法
- 动态规划之最长子序列问题
- word2vec源码思路和关键变量
- linux 命令学习 目录
- STL---获取某个文件夹下的文件
- SQL的执行计划
- jquery批量删除
- 九句话轻松理解线程与异步以及回调函数[Javascript]
- JS正则表达式验证账号、手机号、电话和邮箱