524. 通过删除字母匹配到字典里最长单词
1. 题目描述
2.详细题解
该题是88. 合并两个有序数组(简单)的变形,使用双指针归并两个有序数组,双指针分别指向一个数组,逐一对比判断数字大小并进行归并。针对此题,通过删除字母匹配到字典里最长单词,针对字典中的每个单词,逐一匹配给出的字符串。
针对字典的每一个单词,使用双指针分别指向给定的字符串和单词,同合并两个有序数组类似,两个指针均从左至右遍历。逐一判断两个指针指向的字符是否相同,如果相同,右指针(指向单词的指针)向右移动一位,左指针不管是否一致均向右移动一位,当字符串遍历完(左指针已移出字符串末尾)或者单词遍历完(右指针已移除单词末尾)时则停止遍历,此时若右指针指向位置已超出单词末尾则说明能够通过删除字符串中的字符得到单词,此时满足条件,如果当前单词长度大于已知的单词,或者长度相同但字典序更小,则此时更新答案。
具体算法如下:
- Step1:初始化:双指针left=0,right=0,分别指向字符串和单词的第一个字符索引;
- Step2:判断指针left和right指向的字符是否相同;
- Step3:如果指向的字符相同,则右指针向右移动一个位置,否则不进行操作;
- Step4:左指针向右移动一个位置;
- Step5:当指针left小于字符串长度且右指针小于单词长度时,重复步骤Step2_Step5.
- Step6:匹配循环结束,判断右指针是否等于单词长度;
- Step7:如果等于单词长度,则与当前已知字符串进行长度对比,若长度更长或者相同长度下字典序更小则更新答案;
- Step8:从字典中取下一个未遍历过的单词,重复上述步骤Step1_Step7;
- Step9:所有单词均已遍历,则程序结束。
3.代码实现
3.1 Python
class Solution:
def findLongestWord(self, s: str, dictionary: List[str]) -> str:
res = ''
n = len(s)
for c in dictionary:
left, right = 0, 0
m = len(c)
while left < n and right < m:
if s[left] == c[right]:
right += 1
left += 1
if right == m and len(res) <= m:
res = c if len(res) < m else min(res, c)
return res
3.2 Java
class Solution {
public String findLongestWord(String s, List<String> dictionary) {
int m = s.length();
String res="";
for (String c : dictionary){
int n = c.length();
int left = 0, right = 0;
while (left < m && right < n){
if (s.charAt(left) == c.charAt(right)){
right++;
}
left++;
}
if (right == n && n >= res.length()){
if (n > res.length()){res = c;}
else{
res = c.compareTo(res) < 0 ? c : res;
}
}
}
return res;
}
}
执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code。