版权声明:本文为博主原创文章,未经博主同意不得转载。

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】字符串的组合的更多相关文章

  1. 剑指offer字符串列表

    字符串 面试题5:替换空格 面试题20:表示数值的字符串 面试题58:翻转字符串 面试题58(二):左旋转字符串

  2. 剑指offer字符串1

    面试题5:替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. class Solu ...

  3. leetcode46. Permutations 、47. Permutations II、 剑指offer字符串的排列

    字符串排列和PermutationsII差不多 Permutations第一种解法: 这种方法从0开始遍历,通过visited来存储是否被访问到,level代表每次已经存储了多少个数字 class S ...

  4. 剑指Offer——字符串的排列

    题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: ...

  5. 剑指Offer——字符串的排序

    Question 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描 ...

  6. 用js刷剑指offer(字符串的排列)

    题目描述 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入 ...

  7. 《剑指offer》面试题28:字符串的排列(牛客网版本) java

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  8. 【剑指offer】替换字符串中的空格

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25002199 剑指offer上的第四道题目,在九度OJ上測试通过,但还是有些问题.由于是用 ...

  9. 【剑指offer】删除字符也出现在一个字符串

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除 ...

随机推荐

  1. Golang教程:接口

    什么是接口 在面向对象语言中,接口一般被定义为 :接口定义了一个对象的行为.它仅仅指定了一个对象应该做什么.具体怎么做(实现细节)是由对象决定的. 在 Go 中,一个接口定义为若干方法的签名.当一个类 ...

  2. css内容简介(层叠样式表)

    css是对网页编辑的加色,是对其功能的渲染. 根据规范每个元素都有一个display属性,每个元素都有一个------------如div元素他的默认为block. 行内元素和块级元素 块级元素会占据 ...

  3. redis(2)数据类型

    一.数据类型 redis的数据结构是key-value的键值对的形式,但是它和传统String-String的键值对形式不一样,它的value不仅仅是string类型,而是有着丰富的数据类型,如: 1 ...

  4. 十、集成使用redis

    一.简介 redis是一种非关系型数据库,它的数据结构是key-value的存储形式:能够支持多种类型的数据存储,如:string/list/map/object...等.springboot自然也对 ...

  5. Spring 中任意位置获取 session 和 request

    在web.xml中添加监听: <listener> <listener-class>org.springframework.web.context.ContextLoaderL ...

  6. poi-word导出,导出多图片到word

    一.添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratc ...

  7. java web 之Session

    1.Session简单介绍 由于Http是无状态的协议,所以服务端需要记录用户的状态时,就需要某种机制来识别具体的用户,实现这个机制的方式就是session. 典型的场景比如购物车,当你点击下单按钮时 ...

  8. openMP编程(上篇)之并行程序设计

    openMP简介 openMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 当计算机升级到多核时,程序中创建的线程数量需要随CPU核数变化,如在CPU核数超过线程数 ...

  9. java.io.FileNotFoundException

    1. 概述 上传图片到 o:/mmfiles_2017/39973/25444/333.jpg目录下 目录不存在会报标题中的错误 必须先创建目录 2. 方法 File filePath = new F ...

  10. 前端学习之路之CSS (一)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 简介:    CSS 指层叠样式表 (Cascading Style Sheets)    样式定义如何显示 HT ...