携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。
如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j]的一个子字符串。
示例 1:
输入:words = ["mass","as","hero","superhero"]
输出:["as","hero"]
解释:"as" 是 "mass" 的子字符串,"hero" 是 "superhero" 的子字符串。
["hero","as"] 也是有效的答案。
示例 2:
输入:words = ["leetcode","et","code"]
输出:["et","code"]
解释:"et" 和 "code" 都是 "leetcode" 的子字符串。
示例 3:
输入:words = ["blue","green","bu"]
输出:[]
暴力枚举
对于字符串数组中的某个字符串 ,我们判断它是否是其他字符串的子字符串,只需要枚举 ,其中 ,如果 是 的子字符串,那么将 加入结果中。
var stringMatching = function(words) {
const ret = [];
for (let i = 0; i < words.length; i++) {
for (let j = 0; j < words.length; j++) {
if (i !== j && words[j].search(words[i]) !== -1) {
ret.push(words[i]);
break;
}
}
}
return ret;
};
复杂度分析
- 时间复杂度:,其中 是字符串数组的长度, 是字符串数组中最长字符串的长度。使用 字符串匹配算法可以将时间复杂度优化到 ,其中 是字符串数组中所有字符串的平均长度。
- 空间复杂度:。返回值不计入空间复杂度。如果使用 字符串匹配算法,那么对应的空间复杂度为 。
拼字符串
我们先把words中所有的单词拼成一个大的字符串,然后判断每个字符串是不是有两个位置,有两个位置则证明是存在某个单词是子字符串,加入答案。
public List<String> stringMatching(String[] words) {
List<String> ans = new ArrayList<>();
StringBuilder sb = new StringBuilder();
//拼成一个字符串
for (String word : words) {
sb.append(word).append(",");
}
//是不是存在两个位置
for (String word : words) {
if (sb.indexOf(word) != sb.lastIndexOf(word)) {
ans.add(word);
}
}
return ans;
}