给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。
tips:字典顺序最小的意思不是输入的字典索引最小,而是指ascii码和小,如果和相同还得看ascii小的字母在前在后(我被这个顺序反复地伤害
示例 1:
输入: s = "abpcplea", d = ["ale","apple","monkey","plea"] 输出: "apple"示例 2:
输入: s = "abpcplea", d = ["a","b","c"] 输出: "a"说明:
- 所有输入的字符串只包含小写字母。
- 字典的大小不会超过 1000。
- 所有输入的字符串长度不会超过 1000。
/**
执行用时:18 ms, 在所有 Java 提交中击败了91.06%的用户
内存消耗:39.1 MB, 在所有 Java 提交中击败了92.93%的用户
这个复杂度我算不来
**/
public class Solution {
public String findLongestWord(String s, List<String> dictionary) {
HashMap<Integer,String> map=new HashMap<Integer,String>();//存储匹配字符串
int max=0,index=0;
for(int i=0;i<dictionary.size();i++){
if(isExist(s,dictionary.get(i))){
if(dictionary.get(i).length()>max){//如果长于已匹配字符串,直接存入map
max=dictionary.get(i).length();
map.put(i,dictionary.get(i));
index=i;//存储map最新的key,方便调用
}else if(dictionary.get(i).length()==max&&dictionary.get(i).compareTo(map.get(index))<0){
//如果等于已匹配字符串最大值,那么比较String字典序大小。String中有已定义的compareTo方法。
map.put(i,dictionary.get(i));//存储字典序小的字符串
index=i;
}
}
}
if(map.size()==0)return "";
return map.get(index);//获取最新存入的匹配字符串
}
public Boolean isExist(String s,String ss){//双指针求解是否为匹配子字符串
int rs=s.length()-1;
int rss=ss.length()-1;
if(rs<rss)return false;
while(rs>=0&&rss>=0){
if(s.charAt(rs)==ss.charAt(rss)){
rss--;
rs--;
}else{
rs--;
}
}
if(rss==-1){//说明子字符串全部匹配
return true;
}
return false;
}
}
/**
官方给了暴力、迭代暴力、排序后查找、查找后排序。我上面的方法是先查找是否匹配再排序
暴力方法我看着有点懵,大概思路是先查找字符串的所有子串,再遍历dictionary看是否存在,再选出又长字典序又小子串
这里记录下排序后查找
Java String自带的比较方法很方便
知识点记录:
*comparator(A a1,A a2){return a1.a-a2.a}//升序
*comparator(A a1,A a2){return a2.a-a1.a}//降序
**/
public class Solution {
public String findLongestWord(String s, List<String> dictionary) {
Collections.sort(dictionary,new Comparator<String>(){
public int compare(String d1,String d2){
return d2.length()!=d1.length()?d2.length()-d1.length():d1.compareTo(d2);
} //注意这里的升降序,长度降序,字典序升序
});
for(int i=0;i<dictionary.size();i++){
if(isExist(s,dictionary.get(i))){
return dictionary.get(i);//已排序好子字符串,则匹配成功的第一个则是结果
}
}
return "";
}
public Boolean isExist(String s,String ss){
int rs=s.length()-1;
int rss=ss.length()-1;
if(rs<rss)return false;
while(rs>=0&&rss>=0){
if(s.charAt(rs)==ss.charAt(rss)){
rss--;
rs--;
}else{
rs--;
}
}
if(rss==-1){
return true;
}
return false;
}
}