题目
给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。
示例 1
输入:
s = "abpcplea", d = ["ale","apple","monkey","plea"]
输出:
"apple"
示例 2
输入:
s = "abpcplea", d = ["a","b","c"]
输出:
"a"
题解
- 分别用两个指针遍历字符串和字符串字典
- 假设已有匹配结果为
result
- 若此时
已匹配字符数 + 字符串剩余长度 < result.length
,则没有继续匹配的必要 - 将匹配结果与现有结果作比较,取长度最长且字典顺序最小的字符串
时间复杂度:O(n*x)。n是列表d中字符串的数目,x是字符串s的平均长度
空间复杂度:O(m)。m是列表d中的最长的字符串的长度,因为使用了变量 temp_result
var findLongestWord = function (s, d) {
let result = ""
for (word of d) {
let temp_result = find(s, word, result.length)
if (result.length < temp_result.length) {
result = temp_result
} else if (result.length === temp_result.length && result > temp_result) {
result = temp_result
}
}
return result
};
var find = function (s, word, max) {
let s_p = 0, word_p = 0, count = 0
// 当s没有遍历完且剩余长度+已匹配字符数>=max才有继续匹配的必要
while (s_p != s.length && s.length - s_p + count >= max) {
if (word[word_p] === s[s_p]) {
s_p++
word_p++
count++
} else {
s_p++
}
if (word_p === word.length) {
return word
}
}
return []
}