解题思路
-
基本思路:
- 遍历每个字符串
- 检查是否包含任一关键词
- 记录包含关键词的字符串索引
- 对结果排序
-
优化方案:
- 使用 存储关键词提高查找效率
- 使用 动态存储结果
- 最后转换为数组并排序
代码
class KeywordDetect {
public:
vector<int> containKeyword(vector<string>& A, int n, vector<string>& keys, int m) {
vector<int> result;
// 遍历每个字符串
for(int i = 0; i < n; i++) {
// 检查是否包含任一关键词
for(const string& key : keys) {
if(A[i].find(key) != string::npos) {
result.push_back(i);
break; // 找到一个关键词就可以跳出内层循环
}
}
}
// 处理空结果的情况
if(result.empty()) {
return vector<int>{-1};
}
// 排序结果
sort(result.begin(), result.end());
return result;
}
};
import java.util.*;
import java.util.*;
public class KeywordDetect {
public int[] containKeyword(String[] A, int n, String[] keys, int m) {
ArrayList<Integer> resultList = new ArrayList<>();
// 将关键词存入HashSet提高查找效率
HashSet<String> keySet = new HashSet<>(Arrays.asList(keys));
// 遍历每个字符串
for(int i = 0; i < n; i++) {
// 检查是否包含任一关键词
for(String key : keySet) {
if(A[i].contains(key)) {
resultList.add(i);
break; // 找到一个关键词就可以跳出内层循环
}
}
}
// 处理空结果的情况
if(resultList.isEmpty()) {
return new int[]{-1};
}
// 转换为数组并排序
int[] result = new int[resultList.size()];
for(int i = 0; i < resultList.size(); i++) {
result[i] = resultList.get(i);
}
Arrays.sort(result);
return result;
}
}
class KeywordDetect:
def containKeyword(self, A, n, keys, m):
result = []
# Convert keys to set for faster lookup
key_set = set(keys)
# Check each string
for i in range(n):
# Check if string contains any keyword
for key in key_set:
if key in A[i]:
result.append(i)
break
# Handle empty result
if not result:
return [-1]
# Sort and return result
return sorted(result)
算法及复杂度
- 算法:字符串匹配 + 排序
- 时间复杂度:,其中 为字符串数量, 为关键词数量, 为平均字符串长度
- 空间复杂度:,用于存储结果数组