在保持原始订单的同时,从数字字符串中查找所有可能的数字组合

时间:2016-07-26 04:22:25

标签: algorithm search combinations

假设你有字符串:1234

我需要的是从此字符串生成所有可能的数字组合,但必须保持字符串的原始顺序

每个结果中也必须至少2个数字

在1234的情况下,输出将是列表列表

输出列表:

list: 1, 2, 3, 4
list: 12, 3, 4
list: 123, 4        --Note a list containing only 1234 is not valid
list: 1, 23, 4
list: 1, 234
list: 1, 2, 34
list: 12, 34

另请注意,每个结果列表中的数字始终与原始字符串1234的顺序相同。因此,组合34,21或213,4的列表无效。

我能想到的唯一方法:

  1. 从第一个索引(1)开始
  2. 附加下一个号码以形成新号码(12)
  3. 然后递归传递新形成的数字以附加下一个数字(123)
  4. 第一个索引完成后,我们再次使用第二个索引(2)
  5. 重新开始
  6. ...
  7. 然而,根据我的方法,我不知道如何生成12,34组合

    非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

1 | 2 | 3 | 4 | 5
  |   |   |   |
  d1  d2  d3  d4

假设原点字符串的长度为5,我们通过添加一个可以为空的分隔符d1,d2,d3和d4来划分该字符串。

  • 当d1,d2,d3,d4 全部为空时,我们得到12345
  • 当d2,d3,d4为空时,我们得到1, 2345
  • 没有d1,d2,d3,d4 为空时,我们得到1,2,3,4,5

对于我们添加的每个分隔符,它有两个选项:可见或已消失, 因此,当n是原始字符串的长度时,总可能的计数为2^(n-1) - 1

然后,我们要解决的下一个问题是迭代所有可能性: 使用二进制值来表示分隔符:

for (int i = 1; i <= pow(2, n - 1); i++) {
     // i = 1, 0b0001, d4 is visible, we get 1234,5
     // i = 2, 0b0010, d3 is visible, we get 123,45
     // i = 3, 0b0011, d3 and d4 is visible, we get 123,4,5
     // i = 4, 0b0100, d2 is visible, we get 12,345
     // i = 5, 0b0101, d2 and d4 is visible, we get 12, 34, 5
     // i = 6, 0b0110, d2 and d3 is visible, we get 12, 3, 45
     // i = 7, 0b0111, d2,d3,d4 is visible, we get 12,3,4,5
     // go on...
}

希望帮助...

答案 1 :(得分:0)

您可以使用类似的方法来获得所需的输出。 修改它,因为它是简单的遍历。

String str="1234";
    StringBuilder sb=new StringBuilder(str);
    int l=str.length();
    for(int i=0;i<l;i++){
        int j=i+1;
        if(i!=0)
            j=i+2;
        for(;j<l+1;j++){
            sb.insert(j, ',');
            System.out.println(sb);
            sb.deleteCharAt(j);
        }
        sb=new StringBuilder(str);
        sb.insert(i+1, ',');
    }

它产生以下输出

1,234
12,34
123,4
1234,
1,2,34
1,23,4
12,3,4