多次搜索
难度:
标签:
题目描述
Given a string band an array of smaller strings T, design a method to search b for each small string in T. Output positions
of all strings in smalls
that appear in big
, where positions[i]
is all positions of smalls[i]
.
Example:
Input: big = "mississippi" smalls = ["is","ppi","hi","sis","i","ssippi"] Output: [[1,4],[8],[],[3],[1,4,7,10],[5]]
Note:
0 <= len(big) <= 1000
0 <= len(smalls[i]) <= 1000
- The total number of characters in
smalls
will not exceed 100000. - No duplicated strings in
smalls
. - All characters are lowercase letters.
代码结果
运行时间: 106 ms, 内存: 35.2 MB
/*
* 题目思路:
* 使用 Java Stream API 来实现查找每个 smalls 中的字符串在 big 中出现的所有位置。
* 我们将遍历 smalls 数组,并使用 Streams 来处理每个字符串的查找过程。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class SolutionStream {
public List<List<Integer>> findStringPositions(String big, String[] smalls) {
return IntStream.range(0, smalls.length)
.mapToObj(i -> {
String small = smalls[i];
List<Integer> positions = new ArrayList<>();
int index = big.indexOf(small);
while (index != -1) {
positions.add(index);
index = big.indexOf(small, index + 1);
}
return positions;
})
.collect(Collectors.toList());
}
public static void main(String[] args) {
SolutionStream solution = new SolutionStream();
String big = "mississippi";
String[] smalls = {"is", "ppi", "hi", "sis", "i", "ssippi"};
List<List<Integer>> positions = solution.findStringPositions(big, smalls);
System.out.println(positions);
}
}
解释
方法:
此题解采用的是暴力匹配的方式来找出small中的字符串在big字符串中的所有出现位置。首先,它检查smalls数组是否为空或只含有一个元素。接着,它创建一个结果列表res来存储每个smalls中字符串的匹配位置。对于smalls中的每个字符串,它首先检查该字符串是否存在于big中。如果存在,它则遍历big字符串,通过比较子字符串big[j:j+len(i)]与smalls中的字符串i,来确定所有匹配的起始位置,并将它们添加到一个临时列表temp中。最后,将temp添加到结果列表res中。
时间复杂度:
O(S*len(big))
空间复杂度:
O(S + len(big))
代码细节讲解
🦆
为什么在解决这个问题时选择使用暴力匹配方法而不是更高效的字符串搜索算法,如KMP、Rabin-Karp或Boyer-Moore?
▷🦆
在解决方案的实现中,对于每个small字符串检查是否存在于big中(if i in big)似乎是多余的,因为即使字符串存在,你仍需遍历big来查找所有匹配的位置。这种检查的目的是什么?
▷🦆
暴力匹配方法在big或smalls中的字符串长度非常大时效率可能会很低,有没有可能通过预处理big来优化搜索过程?例如,使用后缀数组或后缀树?
▷