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

111 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

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

给你一个字符串 s 和一个字符串数组 dictionary 作为字典,找出并返回字典中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。

如果答案不止一个,返回长度最长且字典序最小的字符串。如果答案不存在,则返回空字符串。

示例 1:

输入:s = "abpcplea", dictionary = ["ale","apple","monkey","plea"]
输出:"apple"
示例 2:

输入:s = "abpcplea", dictionary = ["a","b","c"]
输出:"a"

提示:

  • 1 <= s.length <= 1000
  • 1 <= dictionary.length <= 1000
  • 1 <= dictionary[i].length <= 1000
  • s 和 dictionary[i] 仅由小写英文字母组成

解题思路

解决这题我们可以先分解为两个子问题

  1. 我们需要判断dictionary 中的字符串 t 是否可以通过删除 s 中的某些字符得到;

  2. 找到长度最长且字典序最小的字符串

  • 对于问题一 我们可以使用双指针可以很直接判断字典里面的字符串,是否属于s的一个子序列。

  • 对于问题二 遍历字典中,所有的字符串,找出长度最长且字典序最小,属于s的子序列的字符串。

代码

class Solution {
    public String findLongestWord(String s, List<String> dictionary) {

        int res=0;
        String ret="";
        for(String k:dictionary)
        {
            if(k.length()>s.length()||!longest(s,k)) continue;

            if(k.length()>res||ret.length()==0||k.length()==res&&ret.compareTo(k)>0)
            {
                res=k.length();
                ret=k;
            }
        }

        return ret;
    }
    public boolean longest(String a,String b)
    {
        int l=0,r=0;
       while(l<a.length()&&r<b.length()){
           if(a.charAt(l)==b.charAt(r))
              r++;
            l++;
       }
        return r==b.length();
    }
}