Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
数组中的字符串匹配
题目地址: leetcode-cn.com/problems/st…
题目描述:
给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。
如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串。
示例
输入:words = ["mass","as","hero","superhero"]
输出:["as","hero"]
解释:"as" 是 "mass" 的子字符串,"hero" 是 "superhero" 的子字符串。
["hero","as"] 也是有效的答案。
输入:words = ["leetcode","et","code"]
输出:["et","code"]
解释:"et" 和 "code" 都是 "leetcode" 的子字符串。
输入: words = ["blue","green","bu"]
输出: []
题目分析
本题难度不高,可以使用暴力求解的方式得出结果,暴力求解就是两次循环,将当前字符与其他所有字符进行匹配进行求解。如果其他字符中含有当前字符,则结果进行添加
暴力求解
var stringMatching = function(words) {
let resArray = [];
for(let i = 0; i < words.length; i++) {
for(let j = 0; j < words.length; j++) {
if(words[j].indexOf(words[i]) != -1 && i != j) {
resArray.push(words[i]);
break;
}
}
}
return resArray;
}
但是暴力求解的时间复杂度并不算好,可以使用排序来优化此算法。
因为需要求的是子字符串,那么数组中最长的字符串肯定不属于其他字符串,所以可以对数组按照字符串长短进行排序,排序后,使index为1的字符开始与其之前的字符串进行匹配,如果之前的字符串中具有该字符,则结果进行添加
这样一来,匹配的次数就会减少很多
代码
var stringMatching = function(words) {
words.sort((a, b)=>{
return b.length - a.length;
})
let resArray = [];
for(let i = 1; i < words.length; i++) {
let item = words[i];
for(let j = 0; j < i; j++) {
if (words[j].indexOf(item) != -1) {
resArray.push(item);
break;
}
}
}
return resArray;
};