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

如何使此组合/排列方法递归?

谷越
2023-03-14
问题内容

我有一个字符串数组列表,希望将所有可能的组合存储到另一个集合中。

例如:

[air,bus,car]
->
[air]
[bus]
[car]
[air,bus]
[air,car]
[bus,air]
[bus,car]
[car,air]
[car,bus]
[air,bus,car]
[air,car,bus]
...
[car,bus,air]

重复并不重要。我现在的代码是:

public ArrayList<String> comb(ArrayList<String> wrds, ArrayList<String> str, int size)
{
    ArrayList<String> s = new ArrayList<String>();
    s.addAll(str);
    if(size != a1.size())
    {
        Iterator e = a1.iterator();
        while(e.hasNext())
        {
            s.add((String)e.next());
        }
        size++;
    }
}

我试图让它递归调用自己,以便它可以存储组合。我可以在代码中缺少什么地方或哪一部分方面获得任何帮助吗?


问题答案:

鉴于这是家庭作业,因此我将尝试为您提供答案的背景。

解决此问题的关键是使用递归。

首先,假设您的数组中有两个项目。您可以删除第一个项目以得到您的第一个组合。将其余项添加到第一项将为您提供第二种组合。删除第二项将为您提供第三种组合。添加剩余的项目给您第四组合。如果有的["air", "bus"]话,将会是:

["air"]
["air", "bus"]
["bus"]
["bus", "air"]

返回的方法可能类似于:

String[][] combinations(String[] strings)

需要注意的重要事项是,可以将包含单个字符串的数组传递给此方法,并且它可以返回其中包含单个字符串的数组的数组。

这个问题有点复杂,因为您必须保持字符串组合的计数,所以在我们解决这个问题之前,了解递归很重要。

想象一下,您想编写一个将两个数字相乘并将它们相乘的乘法方法,但是您只能使用加法和减法。您可以编写一个递归函数,将一个数字添加到自身,直到另一个数字达到退出条件,例如:

public int multiply(int value1, int value2) 
{
  if (value1 > 1) 
  {
    int remaining = value1 - 1;
    return value2 + multiply(remaining, value2);
  }
  else 
  {
    return value2;
  }
}

您可以对数组执行相同的操作,只不过当值命中时退出而不是1在数组包含一项时退出,例如:

public String[][] combinations(String[] strings) 
{
  if (strings.length > 1) 
  {
    ...
  }
  else 
  {
    return new String[][]{strings};
  }
}

由于Java API的原因,它java.util.List比数组更易于使用,因此您需要执行以下操作:

public List<List<String>> combinations(List<String> strings) 
{
  if (strings.size()> 1) 
  {
    ...
  }
  else 
  {
    List<List<String>> result = new ArrayList<List<String>>();
    result.add(strings);
    return result;
  }
}

现在,...重要的是这一点。您需要保留一个列表列表,该列表将作为结果并在上进行迭代strings。对于每个字符串,您可以将该字符串添加到结果中,然后需要创建一个减去当前字符串的子列表,您可以使用该子列表combinations再次调用该方法,以遍历结果并将当前字符串添加到其中包含的每个列表。在代码中,它看起来像:

public List<List<String>> combinations(List<String> strings) 
{
  if (strings.size() > 1) 
  {
    List<List<String>> result = new ArrayList<List<String>>();

    for (String str : strings) 
    {
      List<String> subStrings = new ArrayList<String>(strings);
      subStrings.remove(str);

      result.add(new ArrayList<String>(Arrays.asList(str)));

      for (List<String> combinations : combinations(subStrings)) 
      {
        combinations.add(str);
        result.add(combinations);
      }
    }

    return result;
  }
  else 
  {
    List<List<String>> result = new ArrayList<List<String>>();
    result.add(new ArrayList<String>(strings));
    return result;
  }
}

总之,您要做的是将字符串列表缩减为单个项目,然后将其与前面的项目组合在一起,以在线程返回调用堆栈时产生所有可能的组合。



 类似资料:
  • 我有一个字符串数组列表,希望将所有可能的组合存储到另一个集合中。 例如: 重复并不重要。我现在拥有的代码是: 我正在尝试让它递归调用自己,以便它可以存储组合。我可以得到任何关于代码中缺少的位置或哪个部分的帮助吗?

  • 排列 下一个排列 LeetCode - 31. 下一个排列 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5

  • 本文向大家介绍Java排列组合字符串的方法,包括了Java排列组合字符串的方法的使用技巧和注意事项,需要的朋友参考一下 例如 输入“abc”,打印所有可能出现的组合情况,并且消除重复值。 所谓排列组合如下: 排列组合,字符串:abc bca acb abc cba bac cab 排列组合个数:6 实现代码(结合Java8 lambda表达式实现) 如有更简洁的代码实现,请不要吝啬,贴出来分享下。

  • 本文向大家介绍js实现简单排列组合的方法,包括了js实现简单排列组合的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js实现简单排列组合的方法。分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: 更多关于JavaScript算法相关内容感兴趣的读者可查看本站专题:《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍

  • 目前正在用Daniel Liang的C++入门自学C++。 关于合并排序的话题,我似乎无法理解他的代码是如何递归调用自己的。 我理解合并排序的一般概念,但我很难具体理解这段代码。 在本例中,我们首先将列表1,7,3,4,9,3,3,1,2及其大小(9)传递给mergeSort函数。从那里,我们将列表一分为二,直到数组大小达到1。在这种情况下,我们会得到:1,7,3,4->1,7->1。然后我们进入

  • 我在我的应用程序中有以下合并排序代码。我对递归方法在不满足if条件时从if块中出来后如何再次调用感到非常困惑。 我调试了我的代码,但我仍然没有得到它。调用mergesort(0,号-1)的排序方法首先从mergesort(0,5)开始。低小于高,中间是2,所以接下来运行mergesort(0,2)。这一直持续到我们有mergesort(0,0),在这种情况下,低不小于高,所以它来自if块。但是当我