524. 通过删除字母匹配到字典里最长单词
题目
给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。
示例1:
输入:s = “abpcplea”, dictionary = [“ale”,“apple”,“monkey”,“plea”]
输出:“apple”
解题想法
解题思路其实比较清晰,就是首先对给的待匹配字典的里字符串进行排序,规则就是长的字符串在前,长度一样的按照字典序进行排序,然后就是遍历字典中字符串,返回满足要求的第一个串,个人在实现进行比对判断的时候用了数组空间存s串中的字符的下标然后再遍历比对,后看别人题解,其实此处比多判断用两个指针分别指向s和带判断dictionary[i]就行
未使用双指针
public static class tComparator implements Comparator<String>{
public int compare(String a,String b){
if(a.length()!=b.length()) return b.length() - a.length();
else{
for(int i=0;i<a.length();i++){
if(a.charAt(i)!=b.charAt(i)) return a.charAt(i) - b.charAt(i);
}
}
return 0;//当两个字符串完全相等的时候,返回0
}
}
public String findLongestWord(String s, List<String> dictionary) {
List<List<Integer>> sites = new ArrayList<>();
for(int i=0;i<26;i++){//还是先初始化一下吧
sites.add(i,new ArrayList<>());
}
for(int i=0;i<s.length();i++){
List<Integer> n = sites.get(s.charAt(i)-'a');
sites.get(s.charAt(i)-'a').add(i);
dictionary.sort(new tComparator());
for(int i=0;i<dictionary.size();i++){
String sd = dictionary.get(i);
List<Integer> path = new ArrayList<>();
int j = 0;
for(;j<sd.length();j++){
int k = sd.charAt(j)-'a';
//添加对应的字符的位置,应该是找到count[k]个比当前路径大的位置的字符
//int kt = 0;
int ks = 0;
while(ks<sites.get(k).size()){
if(j-1<0||j-1>=0&&sites.get(k).get(ks)>path.get(j-1)){
break;
}
ks++;
}
if(ks>sites.get(k).size()-1) break; //如果满足,退出的时候应该是正好需要的ks的位置
path.add(sites.get(k).get(ks));
}
if(j>=sd.length()){//完成遍历退出,则应该是符合的
return sd;
}
}
return "";
}
使用双指针
public String findLongestWord(String s, List<String> dictionary) {
dictionary.sort(new tComparator());
//排好序之后,查找的时候两个指针遍历控制就好了,不用再用额外的数组存信息找,其实实际上是一个意思
for(int k=0;k<dictionary.size();k++){
String sd = dictionary.get(k);
if(sd.length()>s.length()) continue;
int i=0;//遍历字符串s
int j=0;//遍历字符串sd
while(i<s.length()&&j<sd.length()){
if(s.charAt(i)==sd.charAt(j)){ //当sd中的字符与S的相等时同时更新位置指针
i++;
j++;
}
else i++;//否则只更新s的位置指针
}
if(j>=sd.length()) return sd; //表示找到满足要求的结果
}
return "";
}