【剑指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上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除 ...
随机推荐
- java 并发(六) --- 锁
阅读前阅读以下参考资料,文章图片或代码部分来自与参考资料 概览 一张图了解一下java锁. 注 : 阻塞将会切换线程,切换内核态和用户态,是比较大的性能开销 各种锁 为什么要设置锁的等级 ...
- 三:SpringTransaction
一:什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二:事务特性(ACID): 原子性(Atomicity) :强调事务的不可分割. 一致性(Consis ...
- 限流(三)Redis + lua分布式限流
一.简介 1)分布式限流 如果是单实例项目,我们使用Guava这样的轻便又高性能的堆缓存来处理限流.但是当项目发展为多实例了以后呢?这时候我们就需要采用分布式限流的方式,分布式限流可以以redis + ...
- 七 FileChannel
FileChannel是一个连接到文件的通道,可以通过文件通道读写文件 FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下. 打开FileChannel 在使用FileChannel之 ...
- docker 镜像构建上下文理解
原文 写得贼好,特别鸣谢,哈哈 如果注意,会看到 docker build 命令最后有一个 . . . 表示当前目录,而 Dockerfile就在当前目录,因此不少初学者以为这个路径是在指定 Dock ...
- 解决vue移动端适配问题
1,先看看网上关于移动端适配讲解 再聊移动端页面适配,rem和vw适配方案! 基础点:rem相对根节点字体的大小.所以不用px; 根字体:字体的大小px; px:你就当成cm(厘米)这样的东西吧: 基 ...
- JS判断请求来自Android手机还是iPhone手机
<script type="text/javascript"> var browser = { versions: function () { var u = navi ...
- 原生js操作DOM基础-笔记
原文参考http://mp.weixin.qq.com/s?__biz=MzU3MDA0NTMzMA==&mid=2247485490&idx=1&sn=15197b4b53e ...
- C# DataGridview转换为DataTable
如已绑定过数据源: DataTable dt = (dataGridView1.DataSource as DataTable) 如未绑定过数据源: public DataTable GetDgvTo ...
- 十五、css3 Filter--滤镜
如何实现下图的效果-—这里就用到了滤镜 给灰色弹框这个标签元素加“伪类”如下: #nearStoreContent .popChoose li:before { 1. z-index:; 2. pos ...