我在编写子字符串搜索变体时遇到了一些麻烦。本质上,我们的目标是编写一个可以执行子字符串搜索的方法,除了源数据是字符串数组而不是一个字符串。
我环顾四周,找不到任何能够优雅地解决这个问题的人。
考虑一些输入数据,例如:
final List<String> source = new ArrayList<String>();
source.add("abc");
source.add("def");
source.add("ghi");
source.add("jkl");
source.add("mnop");
现在假设我想编写一个方法,可以返回目标字符串出现位置的第一个位置。此Pair表示目标出现的源数组中String的第一个索引,以及目标开始的String中的索引。
基于0的索引的示例:
subStringArray(source, "def"); //returns Pair(1,0) - 2nd string - 1st index
subStringArray(source, "ef"); //returns Pair(1,1) - 2nd string - 2nd index
subStringArray(source, "fgh"); //returns Pair(1,2) - 2nd string - 3rd index
subStringArray(source, "hijklmno"); //returns Pair(2, 1) - 3rd string - 2nd index
subStringArray(source, "abcf"); //returns null or Pair(-1,-1);
我知道它会涉及三个for循环,但我不知道如何处理边缘情况,即目标String在源数组中占用多个字符串。
答案 0 :(得分:0)
请看这个
Aho–Corasick algorithm,一种字符串搜索算法,具有解决此问题的线性复杂性。
答案 1 :(得分:0)
一种方法是连接所有字符串并保持其长度。
ArrayList<Integer> lens = new ArrayList();
StringBuilder s = new StringBuilder();
for(Stirng str : list){
s.append(str);
lens.add(str.length());
}
int index = s.indexOf(target);
if(index == -1)
return "-1";
else
{
int i = 0;
while(index - lens.get(i) > 0)
{
index -= lens.get(i);
i ++;
}
return i + " " + index;
}