学习知识点:
1、List<> 、Integer[]、int[]相互转换[][]
2、考虑异常
题目:
面试题 17.17. 多次搜索
给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串,对big进行搜索。输出smalls中的字符串在big里出现的所有位置positions,其中positions[i]为smalls[i]出现的所有位置。
示例:
输入:
big = "mississippi"
smalls = ["is","ppi","hi","sis","i","ssippi"]
输出: [[1,4],[8],[],[3],[1,4,7,10],[5]]
通过代码:
class Solution {
public int[][] multiSearch(String big, String[] smalls) {
if (smalls.length == 0) {
return new int[0][];
}
List<int[]> retList = new ArrayList<>();
for (int i = 0; i < smalls.length; i++) {
retList.add(getWordPosition(smalls[i], big));
}
return retList.toArray(new int[0][]);
}
private static int[] getWordPosition(String small, String big) {
List<Integer> wordList = new ArrayList<>();
int smallLen = small.length();
for (int i = 0; i < big.length() - smallLen + 1; i++) {
if ((!small.isEmpty()) && big.substring(i, i + smallLen).equals(small)) {
wordList.add(i);
}
}
return wordList.stream().mapToInt(Integer::intValue).toArray();
}
}
解题思路:
判断small数组中的每一个字符串和big是否相等,相等则记录索引,添加至结果列表。
出现错误:
第一次未通过用例
"abc"
[""]
错误原因:未考虑small数组中字符串为空的情况;
解决办法:添加空字符串的判断
if ((!small.isEmpty()) && big.substring(i, i + smallLen).equals(small)) {
wordList.add(i);
}