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

Posted Ypuyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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 ""
}

以上是关于[M贪心] lc524. 通过删除字母匹配到字典里最长单词(排序+判断子序列)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode中等524通过删除字母匹配到字典里最长单词

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

Leetcode刷题100天—524. 通过删除字母匹配到字典里最长单词(双指针)—day38

Leetcode刷题100天—524. 通过删除字母匹配到字典里最长单词(双指针)—day38

LeetCode 524. 通过删除字母匹配到字典里最长单词(动态规划) / 695. 岛屿的最大面积 / 54. 螺旋矩阵(背)

LeetCode 524. Longest Word in Dictionary through Deleting (通过删除字母匹配到字典里最长单词)