[Leetcode] 524. Longest Word in Dictionary through Deleting 使用最小堆

524. Longest Word in Dictionary through Deleting

Medium

Given a string and a string dictionary, find the longest string in the dictionary that can be formed by deleting some characters of the given string. If there are more than one possible results, return the longest word with the smallest lexicographical order. If there is no possible result, return the empty string.

Example 1:

Input:
s = "abpcplea", d = ["ale","apple","monkey","plea"]

Output: 
"apple"

 

 

Example 2:

Input:
s = "abpcplea", d = ["a","b","c"]

Output: 
"a"

 

Note:

  1. All the strings in the input will only contain lower-case letters.
  2. The size of the dictionary won't exceed 1,000.
  3. The length of all the strings in the input won't exceed 1,000.

 

方法1:

heap创建最小堆,最长的word在堆顶,这里不需要考虑字典序大小的问题,在最小堆中,如果两个word的长度一样,会自动将字典序最小的那个放到堆顶。使用find函数判断某个字符是否在某个字符串里面。

i := b.find(c, i) 这句话的意思是将b.find()的结果赋值给i。c变量代表的字符是否在b中出现,从索引为i的位置开始往后查找,如果找到了,返回对应的索引,如果没找到返回-1.

:= 这个用法是在python3.8中加上的

import heapq

class Solution:
    def findLongestWord(self, s: str, d: List[str]) -> str:
        def isSubsequence(a: str, b: str) -> bool:
            i = 0
            for c in a:
                if (i := b.find(c, i)) == -1:
                    return False
                i += 1
            return True
        heap = [(-len(word), word) for word in d]
        heapq.heapify(heap)
        while heap:
            word = heapq.heappop(heap)[1]
            if isSubsequence(word, s):
                return word
        return ''

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值