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

给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。

示例 1:

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

输出: 
"apple"

示例 2:

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

输出: 
"a"

说明:

所有输入的字符串只包含小写字母。
字典的大小不会超过 1000。
所有输入的字符串长度不会超过 1000。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting

思路:

其实就是最长子序列,那就先判断一下是不是子序列,还是两个指针喽,如果长的字符串里面的能和短的里面的字符匹配的,也就是一样的,就给他计个数,如果匹配的数量和短的字符串的长度相等,那就是子序列了嘛。

private boolean son(String s1, String s2){
        int i = 0, j = 0;
        while(i < s1.length() && j < s2.length()){
            if(s1.charAt(i) == s2.charAt(j)){
                j++;
            }
            i++;
        }
        return j == s2.length();
    }

判断了是不是子序列是第一步,还要考虑是不是最长对吧,如果一样长怎么办呢,那就考虑字典顺序对吧,定义个变量jilu记录一下最符合的值,有更符合的就更新一下对吧。看下代码,a>b那说明要找的最长子序列不是他,因为他比记录还短啊,要那么短小的就不行,那相等的时候呢,那比较字典顺序,字典顺序要最小对吧,所以compareTo函数他就来了,最后如果长度也符合,字典顺序也符合呢,那就行了呗?行个锤子,还不知道他是不是子序列呢,上面的函数哪来调用一下,结束。

class Solution {
    public String findLongestWord(String s, List<String> d) {
        String jilu = "";
        for(String target : d){
            int a = jilu.length();
            int b = target.length();
            if(a > b || (a == b && jilu.compareTo(target) < 0)){
                continue;
            }
            if(son(s,target) == true){
                jilu = target;
            }
        }
        return jilu;
    }
    private boolean son(String s1, String s2){
        int i = 0, j = 0;
        while(i < s1.length() && j < s2.length()){
            if(s1.charAt(i) == s2.charAt(j)){
                j++;
            }
            i++;
        }
        return j == s2.length();
    }
}
compareTo函数:
  • 如果参数字符串等于此字符串,则返回值 0;
  • 如果此字符串小于字符串参数,则返回一个小于 0 的值;
  • 如果此字符串大于字符串参数,则返回一个大于 0 的值。
原文地址:https://www.cnblogs.com/zzxisgod/p/13335506.html