获取字符串中所有字符组合的子串

    在面对文本处理时,我们经常需要获取一个字符串中所有字符不同组合而成的子串,这个问题是无法简单的通过substring()函数就能解决的。

    为此,我们将该问题视为组合问题。求组合的问题,跟求排列的问题类似,很容易的想到递归的实现方式。

    在求一个字符串中所有字符的组合的时候,针对一个字符,有两种情况,假设在长度为n的字符串中选择长度为m的组合字符串,

            (1)选择长度为n的字符串中的第一个字符,那么要在其余的长度n-1的字符串中选择m-1个字符

            (2)不选择长度为n的字符串中的第一个字符,那么要在其余的长度n-1的字符串中选择m个字符

          递归结束的条件就是,当m为0,即从字符串中不再选出字符的时候,这个时候已经找到了m个字符的组合,输出即可。还有一个条件是,当输入的字符串是串,自然是不能从中选出任何字符的。

基于Java语言的具体的代码如下:


  1. public class TT {  
  2.     public static void main(String ss[]) {  
  3.         perm("abcdef");  
  4.         System.out.println();  
  5.     }  
  6.   
  7.     // 求字符串中所有字符的组合abc>a,b,c,ab,ac,bc,abc  
  8.     public static void perm(String s) {  
  9.         List<String> result = new ArrayList<String>();  
  10.         for (int i = 1; i <= s.length(); i++) {  
  11.             perm(s, i, result);  
  12.         }  
  13.     }  
  14.   
  15.     // 从字符串s中选择m个字符  
  16.     public static void perm(String s, int m, List<String> result) {  
  17.   
  18.         // 如果m==0,则递归结束。输出当前结果  
  19.         if (m == 0) {  
  20.             for (int i = 0; i < result.size(); i++) {  
  21.                 System.out.print(result.get(i));  
  22.             }  
  23.             System.out.println();  
  24.             return;  
  25.         }  
  26.   
  27.         if (s.length() != 0) {  
  28.             // 选择当前元素  
  29.             result.add(s.charAt(0) + "");  
  30.             perm(s.substring(1, s.length()), m - 1, result);  
  31.             result.remove(result.size() - 1);  
  32.             // 不选当前元素  
  33.             perm(s.substring(1, s.length()), m, result);  
  34.         }  
  35.     }  
  36. }  

运行结果如下:
a
b
c
d
e
f
ab
ac
ad
ae
af
bc
bd
be
bf
cd
ce
cf
de
df
ef
abc
abd
abe
abf
acd
ace
acf
ade
adf
aef
bcd
bce
bcf
bde
bdf
bef
cde
cdf
cef
def
abcd
abce
abcf
abde
abdf
abef
acde
acdf
acef
adef
bcde
bcdf
bcef
bdef
cdef
abcde
abcdf
abcef
abdef
acdef
bcdef
abcdef

当字符串长度为n时,得到的结果有(2^n - 1)种组合方式


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值