[M贪心] lc524. 通过删除字母匹配到字典里最长单词(排序+判断子序列)

1. 题目来源

链接:524. 通过删除字母匹配到字典里最长单词

2. 题目解析

首先字母一定不能比字典的字母长度还短,那么一定不是子序列。其次要去一个长度最长且字典序最小的字典中的,满足要求的,子序列。

那么首先就可以针对这两点在字典中进行排序,这样只需要顺序判断字典中排好序的串是否为给定串的子串即可,这个判断子序列就是个简单的双指针,有相同字符则向后走,看最后能不能走到结尾,注意别越界就行。


  • 时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:
    // 判断 s 是否是 t 的子序列
    bool isSubsequence(string s, string t) {
        int n = s.size(), m = t.size();
        if (n > m) return false;
        int l = 0, r = 0;
        for (r; l < n && r < m; r ++ ) {
            if (s[l] == t[r]) l ++ ;
        }

        return l == n;
    }

    string findLongestWord(string s, vector<string>& dictionary) {
        // 长的,字典序小的,在前面
        sort(dictionary.begin(), dictionary.end(), [&](string& s1, string& s2) {
            if (s1.size() == s2.size()) return s1 < s2;
            return s1.size() > s2.size();
        });

        for (auto t : dictionary) 
            if (isSubsequence(t, s))
                return t;

        return "";
    }
};

go 代码

func findLongestWord(s string, dictionary []string) string {
    sort.Slice(dictionary, func(i, j int) bool {
        a, b := dictionary[i], dictionary[j]
        return len(a) > len(b) || len(a) == len(b) && a < b     // 挺不错的实现,
    })

    for _, t := range dictionary {      // 遍历字典
        i := 0                          // 字典串的起始指针
        for j := range s {              // 遍历给定串 s
            if t[i] == s[j] {           // 如果字典和给定串相等,字典向后走
                i ++ 
                if i == len(t) {        // 走到头,为子串,返回字典串
                    return t
                }
            }
        }
    }

    return ""
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值