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