Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,给定N个字母,生成长度为2到N的字符串排列_Java_Combinations - Fatal编程技术网

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

在Java中,给定N个字母,生成长度为2到N的字符串排列,java,combinations,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))

给定以下递归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);
  }
}
受保护的静态void makeStringsList(列出字符串,列出字母){
如果(字母.size()==2){
strings.add(字母.get(0)+“”+字母.get(1));
strings.add(字母.get(1)+“”+字母.get(0));
}
否则{
字符c=字母。删除(0);
makeStringsList(字符串、字母);
List templast=new ArrayList();
用于(字符串s:字符串){
StringBuffer=新的StringBuffer;
对于(int index=0;index
给定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 );
      
      列出子序列的所有排列(设置字符){
      SetpowerSetOfChars=generatePowerSet(字符);
      列表置换=新的ArrayList();
      用于(设置子序列:powerSetOfChars)
      置换.addAll(生成置换(子序列));
      返回置换;
      }
      Set generatePowerSet(集合){
      SetpowerSet=newhashset();
      if(set.size()==0){
      add(新的HashSet());
      返回动力装置;
      }
      字符anElement=set.iterator().next();
      设置。移除(一个元素);
      用于(集合子集:功率集合(集合)){
      Set setWithElement=newhashset();
      setWithElement.add(一个元素);
      setWithElement.addAll(子集);
      powerSet.add(新闻集);
      powerSet.add(子集);
      }
      添加(一个元素);
      返回动力装置;
      }
      //生成集合中提供的字符排列列表。
      列出generatePermutations(设置字符);
      
      generatePowerSet
      方法创建所有集合,因此它还包括大小为0和1的集合。如果你愿意的话,你可以把它们去掉,但主要的想法就在那里

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

      你所需要做的就是移除大小为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 );
      
      列出子序列的所有排列(设置字符){
      SetpowerSetOfChars=generatePowerSet(字符);
      列表置换=新的ArrayList();
      用于(设置子序列:powerSetOfChars)
      置换.addAll(生成置换(子序列));
      返回置换;
      }
      Set generatePowerSet(集合){
      SetpowerSet=newhashset();
      if(set.size()==0){
      add(新的HashSet());
      返回动力装置;
      }
      字符anElement=set.iterator().next();
      设置。移除(一个元素);
      用于(集合子集:功率集合(集合)){
      Set setWithElement=newhashset();
      setWithElement.add(一个元素);
      setWithElement.addAll(子集);
      powerSet.add(新闻集);
      powerSet.add(子集);
      }
      添加(一个元素);
      返回动力装置;
      }
      //生成集合中提供的字符排列列表。
      列出generatePermutations(设置字符);
      
      generatePowerSet
      方法创建所有集合,因此它还包括大小为0和1的集合。如果你愿意的话,你可以把它们去掉,但主要的想法就在那里

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

      你所需要做的就是移除大小为1的

      对于完整的代码,已经编译并证明是有效的,只需到这里亲自尝试一下


      这是家庭作业,对吗?不,我不上学。我为以前的一个kata编写了这个方法,但是我想知道一些应该如何修改它的技巧,这样我就可以让它为我现在正在处理的另一个kata做一些其他的事情。我知道我需要一个递归方法,因为N是由用户指定的,在编译时是未知的。您只需要在运行时知道N,而不需要在编译时知道N。这里的伪代码和解释:谢谢,伙计们!你的解释很有帮助,我得到了我需要的。这是家庭作业,对吗?不,我不上学。我为以前的一个kata编写了这个方法,但是我想知道一些应该如何修改它的技巧,这样我就可以让它为我现在正在处理的另一个kata做一些其他的事情。我知道我需要一个递归方法,因为N是由用户指定的,在编译时是未知的。您只需要在运行时知道N,而不需要在编译时知道N。这里的伪代码和解释:谢谢,伙计们!你的解释他