当前位置: 首页 > 面试题库 >

字符数组的每种组合

许鸿志
2023-03-14
问题内容

尝试显示数组字符的每个组合而不重复字母时遇到问题。

public static String[] getAllLists(String[] elements, int lengthOfList)
{
    //initialize our returned list with the number of elements calculated above
    String[] allLists = new String[(int)Math.pow(elements.length, lengthOfList)];

    //lists of length 1 are just the original elements
    if(lengthOfList == 1) return elements; 
    else
    {
        //the recursion--get all lists of length 3, length 2, all the way up to 1
        String[] allSublists = getAllLists(elements, lengthOfList - 1);

        //append the sublists to each element
        int arrayIndex = 0;

        for(int i = 0; i < elements.length; i++)
        {
            for(int j = 0; j < allSublists.length; j++)
            {
                //add the newly appended combination to the list
                allLists[arrayIndex] = elements[i] + allSublists[j];
                arrayIndex++;
            }
        }

        return allLists;
    }
}

上面的代码可以完美地工作,但是每个字母不能重复使用一次,在这种情况下不能这样做。

我被困在现在该怎么做。


问题答案:

这是一个示例实现。本质上,它需要一个String并遍历每个字符,然后将该字符放在最前面。然后,它在其余字符上递归。该结构消除了重复字母的问题,因为递归的输入已删除了您已经使用的字符。

我还将结果存储在一个集合中,以消除语义上的对等。输入“ aab”可以切换char 0和char 1,但仍为“
aab”。我使用TreeSet保留顺序以便更轻松地验证输出,但是HashSet会更快。

  public static Set<String> permute(String chars)
  {
    // Use sets to eliminate semantic duplicates (aab is still aab even if you switch the two 'a's)
    // Switch to HashSet for better performance
    Set<String> set = new TreeSet<String>();

    // Termination condition: only 1 permutation for a string of length 1
    if (chars.length() == 1)
    {
      set.add(chars);
    }
    else
    {
      // Give each character a chance to be the first in the permuted string
      for (int i=0; i<chars.length(); i++)
      {
        // Remove the character at index i from the string
        String pre = chars.substring(0, i);
        String post = chars.substring(i+1);
        String remaining = pre+post;

        // Recurse to find all the permutations of the remaining chars
        for (String permutation : permute(remaining))
        {
          // Concatenate the first character with the permutations of the remaining chars
          set.add(chars.charAt(i) + permutation);
        }
      }
    }
    return set;
  }

示例运行:

  public static void main(String[] args)
  {
    for (String s : CharPermuter.permute("abca"))
    {
      System.out.println(s);
    }
  }

产生:

aabc
aacb
abac
abca
acab
acba
baac
baca
bcaa
caab
caba
cbaa


 类似资料:
  • 我正在阅读一些面试准备材料,我想知道如果字符串或数组中的字符可以是unicode字符,那么解决这个问题的最佳方法是什么。如果它们是严格的ascii,则可以创建一个大小为256的数组,并将每个ascii字符映射到一个索引,该数组中的位置将表示出现的次数。如果字符串有unicode字符,是否仍然可以这样做,即unicode字符的大小是否合理,您可以使用整数数组的索引来表示它?由于unicode字符的大

  • 问题内容: 我想做这样的事情: 这似乎不起作用。最简单的方法是将多个地址(每个地址3个字段)存储在数组中而不为其创建单独的类,这是最简单的方法吗? 问题答案: 对3个字符串使用第二个ArrayList,而不是原始数组。就是 然后您可以拥有: (我认为这里的类型擦除可能会发生一些奇怪的事情,但我认为这并不重要) 如果您对使用原始数组一无所知,则只需进行较小的更改即可使示例工作。如其他答案所述,数组的

  • 我想知道如何组合用户输入的两个随机字符串。这个程序有点像一个疯狂的Libs游戏,但它是用来创作一首诗的。我首先要求用户输入要使用的名词的数量,然后将它们存储到一个数组中,然后询问形容词的数量,这些形容词也存储在一个数组中。 确切的问题如下: 通过随机选择名词和形容词的组合来创作你的诗歌。在分别使用用户提供的所有名词和形容词之前,不允许再次选择名词或形容词。 现在我被要求通过组合输入的名词和形容词来

  • 本文向大家介绍java 字符串转化为字符数组的3种实现案例,包括了java 字符串转化为字符数组的3种实现案例的使用技巧和注意事项,需要的朋友参考一下 你可以选择最简单的方法解题,但是你需要掌握所有的方法当做知识储备第一种最简单,但是其适用前提是输入: 4(个数) 然后是 1 2 3 4 (也就是输入数字),放入kk数组之中,输出1 2 3 4 第二种: 前提是输入: 4(个数 ) 然后是 1 2

  • 我正在编写一个游戏,想用一个数组来表示一个棋盘。我正在寻找效率,因为我要做许多迭代。在这种情况下,无论是int数组还是char数组对于棋盘表示都很方便。在int数组和char数组中做运算,效率上有区别吗? 我怀疑,因为char数组的每个元素的大小都是1字节,所以它可能会因为内存中的不同表示而变慢(考虑一台现代计算机,它至少有32位用于int表示)...我说的对吗? 先谢谢你。 编辑:我将生成游戏树

  • 问题内容: 我试图理解一个到字符串,一个的字符串表示形式到转换…我将我的转换成一个要发送的字符串,然后我希望我的Web服务(用python编写)将数据直接回显给客户端。 当我从Java应用程序发送数据时… 字节发送.. 发送(这是Arrays.toString()的结果,它应该是我的字节数据的字符串表示形式,该数据将通过电线发送): 在python端,python服务器将字符串返回给调用方(我可以