LeetCode题解之双指针——【中等】524. 通过删除字母匹配到字典里最长单词

题目

给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。

示例 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 []
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值