【剑指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上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除 ...
随机推荐
- Android 屏蔽recent task 按钮
Step 1 Add this permission to the manifest.xml file <uses-permission android:name="android.p ...
- JMS - ActiveMQ的简单使用
首先需要下载ActiveMQ,下面的链接给我们列出了所有版本:http://activemq.apache.org/download-archives.html每个版本为不同的OS提供了链接: 公司电 ...
- Java基础(十一)集合框架
一.集合框架 1.集合框架定义 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常 ...
- es6 import笔记
export输出: // profile.js var firstName = 'Michael'; var lastName = 'Jackson'; var year = 1958; export ...
- js-原始类型和声明变量
** Java的基本数据类型:byte.short.int.long.float.double.char.boolean ** 定义变量 都是用关键字 var(ES6中可以使用const和let来定义 ...
- 2D平面中关于矩阵(Matrix)跟图形变换的讲解
在二维平面上,常用的有以下三种基本的图形变化: 1)Translation 2)Scale 3)Rotation 在canvas的开发中,我们也经常会用到这样的一些图形变换,尤其是我们在写自定义Vie ...
- 点击空白处--某个div 消失
背景:1.需要在 easyui grid 的编辑框 获取焦点的时候,在正下方展示费用类型的网格 2.在点击费用类型网格以外的地方,该网格消失 思路: 一.用easyui 的panel 作为费用类型网格 ...
- 23_ConcurrentLinkedQueue
[简述] ConcurrentLinkedQueue是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueu性能好于BlockingQu ...
- 浮动属性(float)
(1.浮动是一种脱离标准文档流的形式. 作用:浮动就是用来制作多个盒子并排显示,也能设置宽高,负责网页排版 1 float:left; 左浮动 2 float:right; 右浮动 3 float: ...
- Opencv2.4.13与Visual Studio2013环境搭建配置教程
转载:http://www.jb51.net/article/108943.htm 一.安装包的下载与安装 Opencv可免费到官网上去下载,opencv是国外软件,在下载是由于受资源的限制,可能会出 ...