学习目标:
我会持续更新我独特的算法思路,希望能给大家带来不一样的思维拓展!
如果大家感觉有帮助的话,欢迎点赞关注支持哦!
你们的鼓励是我坚持下去的动力!
!!!
力扣题库第524题 官方链接
学习内容:
通过删除字母匹配到字典里最长单词
给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。
示例 1:
输入:s = “abpcplea”, dictionary = [“ale”,“apple”,“monkey”,“plea”]
输出:“apple”
示例 2:
输入:s = “abpcplea”, dictionary = [“a”,“b”,“c”]
输出:“a”
提示:
1 <= s.length <= 1000
1 <= dictionary.length <= 1000
1 <= dictionary[i].length <= 1000
s 和 dictionary[i] 仅由小写英文字母组成
学习时间:
2022.1.24
学习产出:
思路一
双指针
解题思路
- 我们要在字典里面找到最长的单词,则需要遍历我们的字典
- 在遍历字典的时候,我们拿到当前的字符串。我们与最长单词做比较,如果该字符串比最大字符串要短,则直接continue,因为我们要找的是最长的
- 如果该字符串和最大字符串一样长 则比较字母序列 如果该字符串字母序列比较大的话,则直接continue,因为我们找的是字母序列小的
- 比较完之后,我们就要判断这个字符串是不是可以通过删除s的某些字符来组成
- 核心思想来了,我们怎么去判断这个字符串是不是可以通过删除s的某些字符来组成呢?我们利用双指针,一个指向s串的第一个字符,名为l1,一个指向Target字符串的第一个字符名为l2
- 我们判断两个字符是否相等,如果相等则让l1和l2同时加一,即指向下一个字符。如果不相等,则让l1加一,相当于删除了s串的当前字符,然后指向了下一个字符
- 当我们遍历完s的全部或者Target字符串的全部,则判断当前l2是不是到了Target的后一位,即,l2是否等于Target字符串的长度。是不是Target字符串都存在s里面
- 我们遍历完Dictionary里面的字符串之后,我们就可以得到最长单词
public class Solution {
public string FindLongestWord(string s, IList<string> dictionary) {
string TargetString="";
int l1=0;
int l2=0;
for(int i=0;i<dictionary.Count;i++){
l1=TargetString.Length;
l2=dictionary[i].Length;
//如果该字符串比最大字符串要短,则直接continue,因为我们要找的是最长的
//如果该字符串和最大字符串一样长 则比较字母序列 如果该字符串字母序列比较大的话,则直接continue,因为我们找的是字母序列小的
if(l1>l2||(l1==l2&&isRbiggerL(TargetString,dictionary[i]))){
continue;
}
if(isSubstr(s,dictionary[i])){
//如果是子串
TargetString=dictionary[i];
}
}
return TargetString;
}
bool isSubstr(string s,string target){
int l1=0;
int l2=0;
while(l1<s.Length&&l2<target.Length){
if(s[l1]==target[l2]){
l2++;
}
l1++;
}
return l2==target.Length;
}
bool isRbiggerL(string L,string R){
for(int i=0;i<R.Length;i++){
if(L[i]==R[i])continue;
if(L[i]>R[i])return false;
else return true;
}
return false;
}
}
作者:荷兰猪小灰灰
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。