携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
一、题目
LeetCode 数组中的字符串匹配
给你一个字符串数组 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] 都是独一无二的。
二、题解
题目给定有一个字符串的数组,每一个数组元素可以当成是一个单词,其中可能有些单词是其他的单词的子字符串,子字符串要是单词连续出现的单词字符,需要找到这些子字符串的元素单词,并且按顺序返回这些元素单词。
方法一
对于题目中给定的数组来说,元素长度也不是很大,数组元素数量也不是很多,因此可以直接通过暴力枚举来计算即可,简单的就根据题目要求来实现,对整给字符串数组进行遍历,根据要求查询对应需要的子字符串然后按顺序返回即可。具体的首先需要新建一个数组list来存储符合条件的子字符串,然后遍历words字符串数组,因为需要枚举判断每一个字符串,所以需要双重循环来遍历字符串数组,所以对于当前元素单词words[i]需要在去字符串数组中查询是否为某个单词words[j]的子字符串,如果遍历枚举的过程中字符串单词words[i]和字符串单词words[j]是同一个元素的话就需要跳过不校验,否则就校验字符串单词words[i]是否是字符串单词words[j]的子字符串,这里可以直接使用contains方法来校验,如果是满足是子字符串的话就将这个子字符串words[i]添加到结果数组list中,然后就可以直接结束这个单词的枚举继续下一个单词的遍历枚举了。
三、代码
方法一 Java代码
class Solution {
public List<String> stringMatching(String[] words) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < words.length; i++) {
for (int j = 0; j < words.length; j++) {
if (i != j && words[j].contains(words[i])) {
list.add(words[i]);
break;
}
}
}
return list;
}
}
时间复杂度:O(n^2),需要遍历枚举字符串数组。
空间复杂度:O(1),只需使用常数的空间存储。