繁体   English   中英

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

[英]Generate permutations of strings with lengths 2 to N given N letters in Java

给定以下递归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。

我最初为上面的kata创建了上面的方法,之前我在空闲时间在这里工作过,现在我想对其进行修改,以便使其更通用,并返回包含长度为2到N的字符串排列的列表。给N个字母。 是否可以修改上面的方法来完成此任务? 有小费吗? 您的建议将不胜感激!

我想解决这个问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM