[M贪心] lc524. 通过删除字母匹配到字典里最长单词(排序+判断子序列)
Posted Ypuyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[M贪心] lc524. 通过删除字母匹配到字典里最长单词(排序+判断子序列)相关的知识,希望对你有一定的参考价值。
1. 题目来源
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刷题100天—524. 通过删除字母匹配到字典里最长单词(双指针)—day38
Leetcode刷题100天—524. 通过删除字母匹配到字典里最长单词(双指针)—day38
LeetCode 524. 通过删除字母匹配到字典里最长单词(动态规划) / 695. 岛屿的最大面积 / 54. 螺旋矩阵(背)
LeetCode 524. Longest Word in Dictionary through Deleting (通过删除字母匹配到字典里最长单词)