【剑指offer】字符串的组合
版权声明:本文为博主原创文章,未经博主同意不得转载。
https://blog.csdn.net/mmc_maodun/article/details/26405471
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26405471
剑指offer上的拓展题目,输入一个字符串。输出该字符串的字符的全部组合,比方输入字符串:abc,输出a、b、c、ab、ac、bc、abc。
思路:与上一题相似,也能够用递归求解。能够考虑求长度为n的字符串中m个字符的组合。设为C(n,m)。
原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和。对于求C(n, m),从第一个字符開始扫描,每一个字符有两种情况。要么被选中,要么不被选中,假设被选中,递归求解C(n-1, m-1)。假设未被选中,递归求解C(n-1, m)。
无论哪种方式,n的值都会降低,递归的终止条件n=0或m=0。
博主是刚開始尝试用递归去写,写了一个多小时都没写出来,桑心啊!
除了操作二叉树写递归比較顺。其它好多地方用递归愣是憋不出来。尤其字符串操作。
在何海涛博客下看到有人留言。给了个思路。认为非常不错,自己把代码写了出来。详细思路例如以下:
开辟一个于字符串相应长度的int数组(char数组也能够,并且更节省空间),用该数组模拟二进制的加1操作,则该数组的元素仅仅能为0或1,我们规定假设该数组某个位置处的元素是1。则字符串相应位置处的字符參与组合,假设为0,则字符串相应位置处的字符不參与组合。这样讲该int数组。从全0加到全1,便可得到字符串的全部组合。
这里没有去除反复子串,也没依照字典序输出,假设要求依照字典序输出,并去掉反复子串的话。能够採取上道题目一样的办法。先将全部的字符串保存在字符串数组中,而后通过快排使数组中的字符串依照字典序排列。再在输出的时候,跳过反复的字符串。
实现代码例如以下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*
模拟二进制加1操作,当最高位要进位时,说明全部的位都是1,返回false。
用char数组来模拟比int数组更省空间。这里必须传入数组长度len,
因为我们CominationAll中将要传入的字符数组全部初始化为了'\0',
假设在该函数内部用strlen计算的话,会得到len=0。
*/
bool Increment(char *BindAdd,int len)
{
if(BindAdd == NULL)
return false;
BindAdd[len-1]++;
int i;
for(i=len-1;i>=0;i--)
{
if(BindAdd[i] >= 2)
{
if(i == 0)
{
BindAdd[i]--;
return false;
}
else
{
BindAdd[i] -= 2;
BindAdd[i-1]++;
}
}
else
break;
}
return true;
}
/*
输出字符串的全部组合
*/
void CominationAll(char *str)
{
if(str == NULL)
return;
int len = strlen(str);
char *BindAdd = (char *)malloc(len*sizeof(char));
if(BindAdd == NULL)
exit(EXIT_FAILURE);
memset(BindAdd,0,len*sizeof(char));
while(Increment(BindAdd,len))
{
int i;
for(i=0;i<len;i++)
{
if(BindAdd[i] == 1)
putchar(str[i]);
}
putchar('\n');
}
free(BindAdd);
BindAdd = NULL;
}
int main()
{
char str[10];
while(gets(str))
CominationAll(str);
return 0;
}
測试结果:
【剑指offer】字符串的组合的更多相关文章
- 剑指offer字符串列表
字符串 面试题5:替换空格 面试题20:表示数值的字符串 面试题58:翻转字符串 面试题58(二):左旋转字符串
- 剑指offer字符串1
面试题5:替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. class Solu ...
- leetcode46. Permutations 、47. Permutations II、 剑指offer字符串的排列
字符串排列和PermutationsII差不多 Permutations第一种解法: 这种方法从0开始遍历,通过visited来存储是否被访问到,level代表每次已经存储了多少个数字 class S ...
- 剑指Offer——字符串的排列
题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: ...
- 剑指Offer——字符串的排序
Question 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描 ...
- 用js刷剑指offer(字符串的排列)
题目描述 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入 ...
- 《剑指offer》面试题28:字符串的排列(牛客网版本) java
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- 【剑指offer】替换字符串中的空格
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25002199 剑指offer上的第四道题目,在九度OJ上測试通过,但还是有些问题.由于是用 ...
- 【剑指offer】删除字符也出现在一个字符串
转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除 ...
随机推荐
- 数据链路层差错检测之循环冗余检验CRC
引用https://blog.csdn.net/wenqiang1208/article/details/71641414 为什么引入CRC 现实的通信链路都不会是理想的.这就是说,比特在传输的过程中 ...
- Firebird Connection pool is full
今天在做Firebird V3.0.3 x64 版本内存测试,本地PC上,准备开启800个事务(保持不关闭),每个事务做些事,尽量不释放内存. 每次测试当事务数达到时,就提示Connection p ...
- BAT的关于程序员的那些事
前言 你是否早有进入BAT公司的想法,但却因为对其不了解而在门外彷徨? 你是否想把技术团队打造成像BAT这些超级互联网公司,但却无从下手? 你是否已经进入了BAT,但是不知道如何晋升而苦恼? 那这篇文 ...
- requirejs和seajs使用感受
这几天看了下前端模块化的知识,主要是requirejs和seajs相关的知识,还未看es6的模块化知识. 由于目前项目组内的开始推广使用vue,并且开始简单的封装组件,但发现组件js的使用方式依然是原 ...
- 六、mybatis分页插件集成
本文基于上一篇“集成mybatis”内容 1.添加依赖 <!-- mybatis-pageHelper --> <dependency> <groupId>com. ...
- 反编译DLL文件
我们平时在工作中经常会遇到一些已经被编译后的DLL,而且更加麻烦是没有源代码可以进行修改,只能针对这个DLL的文件进行修改才能得到我们想要的结果:本文将通过一个实例来演示如果完成一个简单的修改;我们将 ...
- mysql load data infile auto increment id
1. 问题描述 当使用load data infile 向表中插入数据 而主键id是 auto_increment 时 ,执行 load data 不会报错 但插入也不成功 2. 问题解决 2.1 方 ...
- Android输入法架构学习总结
此文为本人学习输入法之后所做的一个总结报告.与大家分享. 安卓输入法框架(Input Method Framework)IMF 一.输入法框架简介 自Android平台1.5版本以后,Google开放 ...
- qt MessageBOX 消息
void MessageBox::slotQuestion() { switch(QMessageBox::question(this,"Question",tr("It ...
- Android Studio 2.3.2 下载 - 百度网盘
Android Studio是一个为Android平台开发程序的集成开发环境,其包含用于构建Android应用所需的所有工具. Android Studio 2.3.2为最新的稳定版(截止到2017年 ...