如何在数组列表中找到不同大小字符串的所有递归组合?—举例



显然,这几乎是不可能理解的。

那么,这里有一个例子:如果我有一个ArrayList = ["abc", "def"]那么我想要的结果是:

ad ae af 
bd be bf 
cd ce cf

同样可以假设如果我有一个ArrayList = ["ab", "cd", "efg"]:

ace acf acg
ade adf adg
bce bcf bcg
bde bdf bdg

显示所有选项。第一个索引字符串对应于结果的第一个"潜在"字母。第二个对应第二个,以此类推。我一直在研究不同形式的递归,但我似乎陷入了困境。以下是目前为止的内容:

public static void main(String[] args) {
    ArrayList<String> param = new ArrayList<String>();
    param.add("jkl");
    param.add("mno");
    param.add("pqrs");
    System.out.println(giveFrag(param, 0));
}
static String giveLetter(String s, int indexForString) {
    // return the letter given
    return s.substring(indexForString, indexForString+1);
}
static String giveFrag(ArrayList<String> strs, int start) {
    String output = "";
    if (start == strs.size()-1) {
        output = giveLetter(strs.get(start),0);
    } else {
        for (int i = 0; i < strs.get(start).length(); i++) {
            String q = strs.get(start).substring(i,i+1);
            output += q;
            for (int k = strs.size()-1; k < strs.size(); k++) {
                output += giveFrag(strs, start+1);
            }
            output += " ";
        }
        output += "n";
    }
    return output;
}
注意,为了简单起见,我忽略了数组列表的最后一个元素。这可以从giverag()的IF语句中看到。

目前,我的结果如下:

jmp np op 
 kmp np op 
 lmp np op 

现在,进入真正的问题!首先,如果有人发现任何明显的错误会产生这个结果,而不是:

jmp jnp jop
kmp knp kop
lmp lnp lop

请告诉我。如果没有任何明显的,和整个重组是需要的,你能非常具体的我应该做什么,而不是?

另外,如果有人有额外的时间,他们能找到一种方法在迭代时包含最后一个数组元素吗?

非常感谢您的帮助,很抱歉标题太模糊了。

当前输出与问题描述不匹配。输出的第一行应该是:

jmp jmq jmr jms

实现并没有真正接近您所需要的。可以考虑这样:

private void accumulateFrags(List<String> strings, int start, String prefix, List<String> frags) {
  if (start == strings.size()) {
    frags.add(prefix);
    return;
  }
  String current = strings.get(start);
  for (char c : current.toCharArray()) {
    accumulateFrags(strings, start + 1, prefix + c, frags);
  }
}

这个函数将把所有的组合累加到一个列表中。像这样调用它:

List<String> frags = new ArrayList<>();
accumulateFrags(Arrays.asList("jkl", "mno", "pqrs"), 0, "", frags);
System.out.println(frags);

这不会产生您想要的逐行输出。但这应该是相当简单的,所以我把它留给你们作为练习

recursive

// arguments are passed using the text field below this editor
public static void main(String[] args)
{
String arr[] = {"jkl", "mno", "pqrs"};
List<String> res = new ArrayList<String>();
constructStr(res, "", 0, arr);

String s = "";
for (int i=0; i<res.size(); i++) {
  int mod = arr[arr.length-1].length();
  if (i % mod == 0) {
    System.out.println(s); 
    s = res.get(i) + " ";
  }
  else {
    s += res.get(i) + " ";
  }
}
System.out.println(s); 
}
private static void constructStr(List<String> result, String curStr, int i, String arr[]) {
if (i + 1 < arr.length) {
  for (int k=0; k<arr[i].length(); k++) {
    constructStr(result, curStr + arr[i].charAt(k), i + 1, arr);
  }
}
else {
  for (int k=0; k<arr[i].length(); k++) {
    result.add(curStr + arr[i].charAt(k));
  }
}    
}

最新更新