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

双指针 · 04-20

题目链接:https://leetcode.cn/problems/longest-word-in-dictionary-through-deleting/description/

我的思路

也是一开始就想到了用双指针,并且根据指导书中写的,这道题是归并两个有序数组的变式,那自然想到一个指针p放在字符串s,一个指针q放在单词word中,依次遍历。思路为:初始化一个结果变量ans=’’以及last_p=len(s)用于判断实现“字母序最小”的要求(比如s="abce", dictionary=["abe","abc"]时应该输出abc而非abe,一开始理解的是c在s中更靠前,所以abc是字母序更小的单词)

  1. 首先固定q,p移动,判断word[q]是否等于s[p],如果相等,则p,q同时右移1位,如果不相等,则只移动p,重复该步骤
  2. 直到遍历完word,即q==len(word)-1,结束该单词的循环,判断len(word)是否>len(ans),同时判断此时p值是否小于last_p,如果小于,意味着这个答案在s中的次序更靠前,更小,满足题意
  3. 在同时满足上面三个条件的情况下,则将word赋值给ans,并将p,q指针都放回到0位置,准备开始检查下一个单词

这样尽管能跑通,但是犯了一个错误,又是没有get到题目意思,同时被abce这个测试案例给迷惑住了。题目中所指的“字母序最小”的正确意思应该是c比e在26个字母中更靠前,所以应该输出abc,而不是判断字母在s中的位置前后,比如s="bab", dictionary=["ba","ab","a","b"],应该输出ab而不是ba,因为ab的顺序比ba更”正“,意味着次序更小

纠正

  1. 正确理解题意后可以发现,我们其实压根不需要last_p这个变量,只要判断word和ans哪个更小就好,python中可以实现这样的比较
  2. 需要判断word和ans的大小的情况只出现在当word和当前ans长度一致时,因此可以把上面几个条件写成一条:if q == len(word) and (len(word) > len(ans) or (len(word) == len(ans) and word < ans)),当该条件为True时,就将word赋值给ans

反思

  1. 字符串也是可以比较大小的,充分用好这一点可以实现题意中的“返回字母序最小”的序列,比如‘abc’<’abe’,返回为True,能够直接判断

结果

263ms 48.04%, 19.07MB 96.08%