剑指offer-拓展训练-字符的所有组合-全组合

/*
题目:
	给定不含重复字符字符串的全组合。
*/
/*
思路:
	递归法。
	例给定abc,输出的组合长度为1,2,3.
	对于长度为2的组合,分选择a(ab,ac)和不选择a的情况(bc)。
	选择a,则在剩余字符串中选择长度为1的字符组合;
	不选择a,则在剩余字符串中选择长度为2的字符组合。
*/
#include<iostream>
#include<stdio.h>
#include<string>

using namespace std;

string curr;

void combination(string str,int len,int beginIndex){
	//当遍历到字符串的末尾,但所需长度不够,直接返回。
    if(beginIndex == str.size()  && len != 0){
        return;
    }
	//当长度足够,则输出当前字符串。
    if(len == 0 ){
        cout<<curr<<" ";
    }else{
		//选择当前字符串的情况
        curr+=(str[beginIndex]);
        combination(str,len-1,beginIndex+1);
		//不选择当前字符串的情况
        curr.erase(curr.size()-1);
        combination(str,len,beginIndex+1);
    }
}

int main(){
    string str;
    while(getline(cin,str)){
        if(str == "")
            cout<<endl;
        else{
            for(int len = 1; len <= str.size(); len++){
                combination(str,len,0);
                cout<<endl;
            }

        }

    }

}

  

原文地址:https://www.cnblogs.com/buaaZhhx/p/11966363.html

时间: 2024-10-10 05:10:29

剑指offer-拓展训练-字符的所有组合-全组合的相关文章

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

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.比如.输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 这里主要要分析两个方面: 1.怎样推断那些字符是须要删除的字符. 同非常多字符串问题一样.能够

《剑指offer》:[55]字符流中第一个不重复的字符

题目:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前六个字符"google"时,第一个只出现一次的字符是"l".  此题和[35]中找字符串中第一次出现一次的字符是类似的.所以详细过程这里不再赘述. 方案一:顺序扫描.时间复杂度O(N*N)+空间复杂度O(N).顺序扫描后,记录每一个字符出现的次数.然后顺序扫描数组得到第一

剑指OFFER之第一个只出现一次的字符(九度OJ1283)

题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1. 样例输入: ABACCDEFF AA 样例输出: 1 -1 解题思路: 首先考虑到时间复杂度,对字符串进行排序或者双层扫描都会到达O(nlong)---O(n^2)的地步. 所以我们考虑额外使用一个数组进行计数,线性时间扫描数组,然后再按照原来的顺序扫描数组找到次数为

【剑指offer】第一个只出现一次的字符

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27106997 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1. 样例输入: ABACCDEFF AA 样例输出: 1 -1 处理字符串中重复或者次数出现等问题,最常用的就是哈希表,用字符串中的字符作为key,

【剑指offer】删除在另一个字符串中出现的字符

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 这里主要要分析两个方面: 1.如何判断那些字符是需要删除的字符.同很多字符串问题一样,可以开辟

剑指offer (35) 第一个只出现一次的字符 字符哈希表

题目:在字符串中找出第一个只出现一次的字符 题解分析:用空间换时间,使用哈希表,key为字符,value是该字符出现的次数 字符是一个长度为8的数据类型,因此总共只有256种可能,我们可以创建一个长为256的数组, 每个字符根据其ASCII码值作为数组的下标,即哈希表的key,而相应数组位置存储每个字符出现的次数,即哈希表的value char GetFirstOnce(const char* str) { assert(str != NULL); const int hashSize = 25

【剑指offer】字符串的组合

转载请注明出处: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),从第一个字符开始扫描,每个字符有两种

【剑指offer】二叉树的镜像

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25915971 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.C

剑指Offer——Trie树(字典树)

剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高. Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的. Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.可见,优