我的问题的简短摘要: 我不知道为什么但我的ArrayList中的元素被跳过,因此不会增加它们。
我有以下代码:
public static ArrayList<Integer> match(String S, String T) {
ArrayList<Integer> ret = new ArrayList<>();
ArrayList<int[]> I = new ArrayList<>(); // (start, curT)
for (int i = 0; i < S.length(); i++) {
for (int j = 0; j < I.size(); j++) { // loop potential matches
int[] curI = I.get(j);
curI[1]++;
System.out.println("SimpleStringMatcher.match: run " + i + " curI[" + j + "]:" + Arrays.toString(curI));
if (T.charAt(curI[1]) != S.charAt(i)) { // if it doesn't match, remove it
System.out.println("SimpleStringMatcher.match: run " + i + " T.charAt(" + curI[1] + ")[" + T.charAt(curI[1]) + "] != S.charAt(" + i + ")[" + S.charAt(i) + "]");
I.remove(j);
} else if (curI[1] == T.length() - 1) { // if cur pos of the potential match equals the n(T) its a match
I.remove(j);
ret.add(curI[0]);
}
}
if (S.charAt(i) == T.charAt(0)) { // add new potential match
if (T.length() > 1) { // if n(T) equals 1, it's a match
I.add(new int[]{i, 0});
} else {
ret.add(i);
}
}
System.out.println("SimpleStringMatcher.match: run " + i + " I:" + getArrString(I) + "; R:" + getArrString(ret));
}
return ret;
}
它在字符串S中搜索字符串T,并在ArrayList<Integer>
中返回匹配起始位置。
为此,我使用ArrayList<int[]> I
,它将潜在候选人存储为一对:(start, curT)
。 start
是潜在匹配开始的S
中的位置,curT
是当前位置int T
。
现在我的问题;当我执行这样的方法时:
public static void main(String[] args){
String s = "gagagagagagagagag";
String t = "gagagag";
System.out.println("String S: '" + s + "'; T: '" + t + "'; Match: " + SimpleStringMatcher.match(s, t).toString());
}
我得到以下输出:
SimpleStringMatcher.match: run 0 I:{[0, 0]}; R:{}
SimpleStringMatcher.match: run 1 curI[0]:[0, 1]
SimpleStringMatcher.match: run 1 I:{[0, 1]}; R:{}
SimpleStringMatcher.match: run 2 curI[0]:[0, 2]
SimpleStringMatcher.match: run 2 I:{[0, 2];[2, 0]}; R:{}
SimpleStringMatcher.match: run 3 curI[0]:[0, 3]
SimpleStringMatcher.match: run 3 curI[1]:[2, 1]
SimpleStringMatcher.match: run 3 I:{[0, 3];[2, 1]}; R:{}
SimpleStringMatcher.match: run 4 curI[0]:[0, 4]
SimpleStringMatcher.match: run 4 curI[1]:[2, 2]
SimpleStringMatcher.match: run 4 I:{[0, 4];[2, 2];[4, 0]}; R:{}
SimpleStringMatcher.match: run 5 curI[0]:[0, 5]
SimpleStringMatcher.match: run 5 curI[1]:[2, 3]
SimpleStringMatcher.match: run 5 curI[2]:[4, 1]
SimpleStringMatcher.match: run 5 I:{[0, 5];[2, 3];[4, 1]}; R:{}
SimpleStringMatcher.match: run 6 curI[0]:[0, 6]
SimpleStringMatcher.match: run 6 curI[1]:[4, 2]
SimpleStringMatcher.match: run 6 I:{[2, 3];[4, 2];[6, 0]}; R:{0}
SimpleStringMatcher.match: run 7 curI[0]:[2, 4]
SimpleStringMatcher.match: run 7 T.charAt(4)[g] != S.charAt(7)[a]
SimpleStringMatcher.match: run 7 curI[1]:[6, 1]
SimpleStringMatcher.match: run 7 I:{[4, 2];[6, 1]}; R:{0}
SimpleStringMatcher.match: run 8 curI[0]:[4, 3]
SimpleStringMatcher.match: run 8 T.charAt(3)[a] != S.charAt(8)[g]
SimpleStringMatcher.match: run 8 I:{[6, 1];[8, 0]}; R:{0}
SimpleStringMatcher.match: run 9 curI[0]:[6, 2]
SimpleStringMatcher.match: run 9 T.charAt(2)[g] != S.charAt(9)[a]
SimpleStringMatcher.match: run 9 I:{[8, 0]}; R:{0}
SimpleStringMatcher.match: run 10 curI[0]:[8, 1]
SimpleStringMatcher.match: run 10 T.charAt(1)[a] != S.charAt(10)[g]
SimpleStringMatcher.match: run 10 I:{[10, 0]}; R:{0}
SimpleStringMatcher.match: run 11 curI[0]:[10, 1]
SimpleStringMatcher.match: run 11 I:{[10, 1]}; R:{0}
SimpleStringMatcher.match: run 12 curI[0]:[10, 2]
SimpleStringMatcher.match: run 12 I:{[10, 2];[12, 0]}; R:{0}
SimpleStringMatcher.match: run 13 curI[0]:[10, 3]
SimpleStringMatcher.match: run 13 curI[1]:[12, 1]
SimpleStringMatcher.match: run 13 I:{[10, 3];[12, 1]}; R:{0}
SimpleStringMatcher.match: run 14 curI[0]:[10, 4]
SimpleStringMatcher.match: run 14 curI[1]:[12, 2]
SimpleStringMatcher.match: run 14 I:{[10, 4];[12, 2];[14, 0]}; R:{0}
SimpleStringMatcher.match: run 15 curI[0]:[10, 5]
SimpleStringMatcher.match: run 15 curI[1]:[12, 3]
SimpleStringMatcher.match: run 15 curI[2]:[14, 1]
SimpleStringMatcher.match: run 15 I:{[10, 5];[12, 3];[14, 1]}; R:{0}
SimpleStringMatcher.match: run 16 curI[0]:[10, 6]
SimpleStringMatcher.match: run 16 curI[1]:[14, 2]
SimpleStringMatcher.match: run 16 I:{[12, 3];[14, 2];[16, 0]}; R:{0;10}
String S: 'gagagagagagagagag'; T: 'gagagag'; Match: [0, 10]
我的问题理解是从run 6
到run 10
的过程:在我看来它似乎遗漏了I
中的一些元素。
不应该输出
SimpleStringMatcher.match: run 6 curI[0]:[0, 6]
SimpleStringMatcher.match: run 6 curI[1]:[2, 4]
SimpleStringMatcher.match: run 6 curI[2]:[4, 2]
SimpleStringMatcher.match: run 6 I:{[2, 4];[4, 2];[6, 0]}; R:{0}
这也会在接下来的4次运行中发生,这样做也会导致curI[1]
增加1
,从而扭曲整个结果。有没有人知道为什么会这样?
我是一名学生,目前正在尝试了解字符串匹配是如何工作的,所以请不要回答类似于&#39;只需使用X.y()&#39;。
PS:这是我第一次在这里提问,所以请给我反馈我应该做得更好/不同的事情。
PSS:英语不是我的第一语言。希望你们无论如何都能理解它。