查找可能发生重叠的字符串数组中的字符串索引

时间:2015-10-20 06:10:56

标签: java string algorithm full-text-search text-search

我在编写子字符串搜索变体时遇到了一些麻烦。本质上,我们的目标是编写一个可以执行子字符串搜索的方法,除了源数据是字符串数组而不是一个字符串。

我环顾四周,找不到任何能够优雅地解决这个问题的人。

考虑一些输入数据,例如:

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在源数组中占用多个字符串。

2 个答案:

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