在Java中给出N个字母,生成长度为2到N的字符串的排列

时间:2011-09-19 04:55:35

标签: java combinations

给出以下递归Java方法:

protected static void makeStringsList(List<String> strings, List<Character> letters) {
  if (letters.size() == 2) {
    strings.add(letters.get(0) + "" + letters.get(1));
    strings.add(letters.get(1) + "" + letters.get(0));
  }
  else {
    Character c = letters.remove(0);
    makeStringsList(strings, letters);
    List<String> tempList = new ArrayList<String>();
    for (String s : strings) {
      StringBuffer buffer = new StringBuffer(s);
      for (int index = 0; index < s.length() + 1; index++) {
        buffer.insert(index, c);
        tempList.add(buffer.toString());
        buffer = new StringBuffer(s);
      }
    }
    strings.addAll(tempList);
  }
}

给定N个字母,上面的代码生成一个列表,其中包含使用所有相同N个字母的字符串的排列。例如,给定(1,2,3),它会生成:

  • 123
  • 132
  • 213
  • 231
  • 312
  • 321
它还会在列表中添加少于N个字母的字符串,但它们并非详尽无遗。使用相同的示例,23和32也在列表中,但12,21,13和31不在列表中。

我最初创建了上面的方法,用于我在空闲时间之前在here工作的kata,我想现在修改它以便我可以使它更通用并返回包含排列的列表字符串长度为2到N 给定N个字母。是否可以修改上述方法来完成此任务?有小费吗?非常感谢您的建议!

1 个答案:

答案 0 :(得分:1)

我想帮助解决这个问题。

我认为最好的解决方法是生成给定字符集的幂集,然后找到电源集中每个字符串组合可以生成的字符串组合。

List <String> allPermutationsOfSubsequences( Set <Character> chars ) {

    Set < Set <Character> > powerSetOfChars = generatePowerSet ( chars );

    List <String> permutations = new ArrayList <String> ();

    for (Set <Character> subsequence : powerSetOfChars)
        permutations.addAll( generatePermutations ( subsequence ) );

    return permutations;
}

Set <Set <Character>> generatePowerSet ( Set <Character> set ) {
    Set < Set <Character> > powerSet = new HashSet < Set <Character> > ();
    if (set.size() == 0) {
        powerSet.add(new HashSet <Character> ());
        return powerSet;
    }

    Character anElement = set.iterator().next();
    set.remove(anElement);

    for (Set <Character> subset : powerSet(set)) {
        Set <Character> setWithElement = new HashSet <Character> ();
        setWithElement.add(anElement);
        setWithElement.addAll(subset);
        powerSet.add(newSet);
        powerSet.add(subset);
    }

    set.add(anElement);

    return powerSets;
}

//Generates a list of permutations of the characters provided in the set.
List <String> generatePermutations ( Set <Character> chars );

generatePowerSet方法创建所有集合,因此它还包括大小为0和1的集合。如果您愿意,可以删除它们,但主要想法就在那里。

样本输出:[3,2,1,31,13,32,23,21,12,321,312,231,213,132,123]

您需要做的就是删除1号。

对于完整的代码,已经编译并且已经显示可以工作,只需到这里自己试一试!

http://pastebin.com/P3YMmT2m