如何在ArrayList中找到不同大小字符串的所有递归组合? - 参见示例

时间:2016-11-15 07:00:38

标签: java recursion arraylist

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

所以,这是一个例子: 如果我有一个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

显示所有选项。第一个索引String对应于结果的第一个“潜在”字母。第二个对应于第二个,依此类推。我一直在研究不同形式的递归,但我似乎遇到了一个漏洞。以下是我到目前为止的情况:

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;
}

请注意,为了简单起见,我忽略了ARRAYLIST的最后一个元素。这可以在giveFrag()的IF声明中看到。

目前,我的结果如下:

jmp np op 
 kmp np op 
 lmp np op 

现在,到实际的问题!首先,如果有人发现任何会产生这种结果的明显错误而不是:

jmp jnp jop
kmp knp kop
lmp lnp lop

请告诉我。如果没有任何明显的重组,并且需要整个重组,那么请您具体说明我应该做什么呢?

另外,如果有人有任何额外的时间,他们是否可以在迭代时找到包含最后一个数组元素的方法?

非常感谢你的帮助,并对这个令人难以置信的模糊标题感到抱歉。

2 个答案:

答案 0 :(得分:0)

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

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);

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

答案 1 :(得分:0)

递归

// 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));
  }
}    
}