gpt4 book ai didi

java - 获取子序列匹配中的索引列表

转载 作者:行者123 更新时间:2023-12-01 05:55:39 24 4
gpt4 key购买 nike

我有 2 个序列,例如 s=aaba 和 ss=aa,并且我希望 ss 在 s 中一直存在。在这个例子中:[0,1]、[0,3] 和 [1,3]我的代码如下。它工作得很好,除了很长的带有多个 s 的 s 。在这种情况下我有

线程“main”中出现异常 java.lang.OutOfMemoryError:超出 GC 开销限制(我已经最大限度地使用带有 -Xmx 的 java...)

public static ArrayList<ArrayList<Integer>> getListIndex(String[] s, String[] ss, int is, int iss) {
ArrayList<ArrayList<Integer>> listOfListIndex = new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Integer>> listRec = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> listI = new ArrayList<Integer>();

if (iss<0||is<iss){
return listOfListIndex;
}

if (ss[iss].compareTo(s[is])==0){

//ss[iss] matches, search ss[0..iss-1] in s[0..is-1]
listRec = getListIndex(s,ss,is-1,iss-1);

//empty lists (iss=0 for instance)
if(listRec.size()==0){
listI = new ArrayList<Integer>();
listI.add(is);
listOfListIndex.add(listI);
}
else{
//adding to what we have already found
for (int i=0; i<listRec.size();i++){
listI = listRec.get(i);
listI.add(is);
listOfListIndex.add(listI);
}
}
}
//In all cases
//searching ss[0..iss] in s[0..is-1]
listRec = getListIndex(s,ss,is-1,iss);
for (int i=0; i<listRec.size();i++){
listI = listRec.get(i);
listOfListIndex.add(listI);
}

return listOfListIndex;
}

有什么办法可以更有效地做到这一点吗?

最佳答案

我怀疑递归是问题所在(想想最大递归深度是多少)。通过收集TreeSets中sss每个字符的不等度,然后简单地取,可以高效地实现该算法。 tailSet 当需要在字符串中“前进”时。

import java.util.*;


public class Test {

public static Set<List<Integer>> solutions(List<TreeSet<Integer>> is, int n) {

TreeSet<Integer> ts = is.get(0);
Set<List<Integer>> sol = new HashSet<List<Integer>>();
for (int i : ts.tailSet(n+1)) {
if (is.size() == 1) {
List<Integer> l = new ArrayList<Integer>();
l.add(i);
sol.add(l);
} else
for (List<Integer> tail : solutions(is.subList(1, is.size()), i)) {
List<Integer> l = new ArrayList<Integer>();
l.add(i);
l.addAll(tail);
sol.add(l);
}
}
return sol;
}


public static void main(String[] args) {
String ss = "aaba";
String s = "aa";

List<TreeSet<Integer>> is = new ArrayList<TreeSet<Integer>>();

// Compute all indecies of each character.
for (int i = 0; i < s.length(); i++) {
TreeSet<Integer> indecies = new TreeSet<Integer>();
char c = s.charAt(i);
for (int j = 0; j < ss.length(); j++) {
if (ss.charAt(j) == c)
indecies.add(j);
}
is.add(indecies);
}

System.out.println(solutions(is, -1));
}
}

输出:

[[0, 1], [1, 3], [0, 3]]

关于java - 获取子序列匹配中的索引列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3094779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com