1408. 数组中的字符串匹配
题目描述:
给你一个字符串数组 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"]
输出:[]
限制及提示:
- 1 <= words.length <= 100
- 1 <= words[i].length <= 30
- words[i] 仅包含小写英文字母。
- 题目数据 保证 每个 words[i] 都是独一无二的。
解题分析及思路:
本题直接暴力即可。
对于每一个元素word[i]
,我们只需要遍历数组中的其他元素word[j]
是否为它的子字符串,或者word[i]
是word[j]
的子字符串。如果符合,则添加到结果集中。
for i := 0; i < l; i++ {
for j := i + 1; j < l; j++ {
if strings.Contains(words[i], words[j]) {
ans = append(ans, words[j])
}
if strings.Contains(words[j], words[i]) {
ans = append(ans, words[i])
}
}
}
为避免重复判断,定义flag
来标记当前位置是否已经在结果集中。
func stringMatching(words []string) (ans []string) {
l := len(words)
flag := make([]bool, l)
for i := 0; i < l; i++ {
for j := i + 1; j < l; j++ {
if flag[i] || flag[j] {
continue
}
if strings.Contains(words[i], words[j]) {
ans = append(ans, words[j])
flag[j] = true
}
if strings.Contains(words[j], words[i]) {
ans = append(ans, words[i])
flag[i] = true
}
}
}
return
}
复杂度:
- 时间复杂度:O(n^2 * L^2)
- 空间复杂度:O(n)
执行结果:
- 执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
- 内存消耗:2.2 MB, 在所有 Go 提交中击败了100.00%的用户
Tags :
通过次数 50.3K 提交次数 78.2K 通过率 64.3%