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

问题描述:假如字符串中所有字符都不重复,如何输出字符串的所有组合。例如: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 main(String[] args) {

  String s = "abc";
  ArrayList<String> result = combineString(s);
  for(String r : result){
    System.out.println(r);
  }
}

private static ArrayList<String> combineString(String s) {
  int len = s.length();
  ArrayList<String> list = new ArrayList<String>();
  int count = (int) (Math.pow(2, len));
  for(int i = 1; i < count; ++i){
    String temp = "";
    String str = Integer.toBinaryString(i);
    while(str.length() < len){
      str = "0" + str;
    }
    for(int j = 0; j < str.length(); ++j){
      if(str.charAt(j) == ‘1‘){
        temp += s.charAt(j);
      }
    }
    list.add(temp);
  }
  return list;
}

时间: 2024-11-09 06:10:44

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

字符串的排列组合总结

问题1 :输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 思路:这是个递归求解的问题.递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环:(2)子问题在规模上比原问题小:(3)子问题可通过再次递归调用求解:(4)子问题的解应能组合成整个问题的解. 对于字符串的排列问题.如果能生成n - 1个元素的全排列,就能生成n个元素的全排列.对于只有1个元素的集合,可以直

SQL Server如何用SQL实现一批字符串的全部组合

原文:SQL Server如何用SQL实现一批字符串的全部组合 在SQL Server中,如何用SQL去实现得到一批字符串的全部组合呢?这个是同事在实际需求当中遇到的一个问题,他的具体需求如下所示: 传入参数格式为'1,2,3,224,15,6'   'A,BC,GHT,TTY,B,E' 输出的内容为分割后字符串的所有非排列组合 !-阶乘,如!=5××××=120  (M!/(N!*((M-N)!))) 公式描述:组合数公式是从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中

谭浩强 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<<"反

printf输出字符串的一些格式

1. 原样输出字符串:    printf("%s", str); 2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐:    printf("%Ns", str);             --N 为指定长度的10进制数值 3. 输出指定长度的字符串, 超长时不截断, 不足时左对齐:    printf("%-Ns", str);            --N 为指定长度的10进制数值 4. 输出指定长度的字符串, 超长时截断, 不足时

编程题:用指针变量输出字符串

#include<stdio.h> void main() {  char *string="Hello"; printf("%s\n",string); } 字符串指针变量的介绍: 运行结果: 编程题:用指针变量输出字符串,布布扣,bubuko.com

Swift入门(十二)——利用Extension添加逆序输出字符串方法

Swift好像没有自带逆序输出字符串的方法,于是决定通过拓展(Extension)给String类添加一个逆序输出字符串的reverse方法. 首先新建一个Swift文件,命名规则不太清楚,于是暂且模仿OC叫做String+Operation吧,然后实现我们需要拓展的方法.下面先贴上代码,然后解释一下这段代码. //String+Operation.swifft import Foundation //逆序输出swift中的字符串 extension String{ func Reverse()

cout输出字符串指针

先给出通过字符型指针输出字符串的示例代码,如下: #include <iostream>using std::cout;using std::endl; int main(){ const char *pszStr = "this is a string"; // 输出字符串cout << "字符串:" << pszStr << endl; // 显然不会输出地址值cout << "字符串起始地址