输出字符串所有组合

描述

输入字符串"abc",则输出a、b、c、ab、ac、bc、abc 共7种组合。

分析

方法一,递归法。遍历每个字符串,每个字符两种情况取或不取。时间复杂度为O(n的2次方)。

方法二,根据每个字符只有取和不取两种情况,0表示不取,1表示取该字符,则原题可以解释为要求输001到111这个组合对应的字符串。

代码

方法一

public class Test {
    /*
    * 递归
    * */
    public static void combinate(char[] chars,int begin,int len,StringBuffer sb){
        if(len==0){
            System.out.println(sb);
            return;
        }
        if(begin==chars.length)
            return;
        sb.append(chars[begin]);   //取当前字符
        combinate(chars,begin+1,len-1,sb);
        sb.deleteCharAt(sb.length()-1);  //不取当前字符
        combinate(chars,begin+1,len,sb);
    }

    public static void main(String[] args) {
        String str="abc";
        char[] chars=str.toCharArray();
        StringBuffer sb=new StringBuffer();
        for(int i=1;i<=str.length();i++){
            combinate(chars,0,i,sb);
        }
    }
}

方法二

public class Test {
    public static void combinate(char[] c){
        if(c==null) return;
        int len=c.length;
        boolean used[]=new boolean[len];  //默认值false;
        char cache[]=new char[len];
        int result=len;
        while(true){
            int index=0;
            while(used[index]){
                used[index]=false;
                ++result;
                if(++index==len)
                    return;
            }
            used[index]=true;
            cache[--result]=c[index];
            System.out.print(new String(cache).substring(result)+" ");
        }
    }

    public static void main(String[] args) {
        String str="abc";
        char[] c=str.toCharArray();
        combinate(c);
    }
}
时间: 2024-10-14 02:35:39

输出字符串所有组合的相关文章

如何输出字符串的所有组合

问题描述:假如字符串中所有字符都不重复,如何输出字符串的所有组合.例如:abca,结果应是a,b,c,ab,ac,bc,abc.最容易想到的就是递归了,但效率会变得很差,因为栈被调用了2^n次方,为了提高效率,可以构造一个长度为n的01字符串,表示输出结果中是否包含某个字符,例如:001->c,010->b,101->ac......,所以原题就是要求输出"001"-"111"这2^n-1个组合对应的字符串. public static void

字符串所有组合

[问题] 输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. [分析解法1] 对于字符串中每个字符,只有两种情况:一种就是出现在组合中,一种是不出现在组合中. [代码] void combination(char *str, char *res, int strPos, int resPos, int size) { if (strPos == size) { res[resPos] = '\0'; printf("%s\n&

【剑指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),从第一个字符开始扫描,每个字符有两种

55. 2种方法求字符串的组合[string combination]

[本文链接] http://www.cnblogs.com/hellogiser/p/string-combination.html [题目] 题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. [分析] 在之前的博文28.字符串的排列[StringPermutation]中讨论了如何用递归的思路求字符串的排列.同样,本题也可以用递归的思路来求字符串的组合. [递归法求组合] 可以考虑求长度为n的字符串中m个字符的组合,

字符串排列组合问题

一.全排列无重复字符 #include<stdio.h> #include<string.h> char buf[1024]; void func(int index); void swap(int index1,int index2); int main() { memset(buf,0,sizeof(buf)); sprintf(buf,"abc"); func(0); return 0; } void func(int index) { if(index

字符串全组合(淘宝宝贝关键字)

小伙伴最近开了家淘宝店,每天为宝贝的名称弄得很麻烦,经常需要根据不同的关键字来组合宝贝的名称,但不知道啥组合能引入更多的流量,所以每个都试着弄弄看,所以这就需要一个字符串的组合. 在那个夜黑风高的晚上,小伙伴带着我去华强北吃了寿司,无意间谈了这个小东西,实现难度不高,立刻动手: 1 internal class Program 2 { 3 /* 4 思路:获取需要组合的字符串数组,循环读取字符串数组成立组合,再根据该组合循环再去组合,其实就是递归读取,用Contains判断是有包含即可 5 */

谭浩强 c程序设计 8.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串&quot;486&quot;。n的位数不确定,可以是任意位数的整数。

8.17用递归法将一个整数n转换成字符串.例如,输入486,应输出字符串"486".n的位数不确定,可以是任意位数的整数. #include <stdio.h> char str1[20];int i=0;long n;int main(){        int longToStr(long n);    char *revstr(char *str, int len);    printf("请输入一个整数n:\n");    scanf("

跟王老师学Java三大特性(二):案例 QuickHit:游戏输出字符串

案例 QuickHit:游戏输出字符串 主讲教师:王少华   QQ群号:483773664 学习目标 完成游戏输出字符串 一.需求说明 在控制台输出随机字符串 二.思路分析 生成字符串 输出字符串 返回字符串 三.难点提示 Game类中的player属性,代表玩家,查询player的级别号,根据级别号到LevelParam类中获取该级别的字符串长度 字符串长度固定可以通过for循环来实现,而随机内容可以通过获取随机数,而不同随机数对应不同字符来实现 四.参考代码 1 2 3 4 5 6 7 8

【C++】输入并反向输出字符串

<pre name="code" class="cpp">// 反向输出字符串 #include<iostream> #include<string.h> using namespace std; void f(char p[]); int main() { char s[50]; cout<<"请输入一个字符串: "; cin>>s; f(s); cout<<"反