leetcode-524.通过删除字母匹配到字典里最长单词
双指针法
题目详情
给你一个字符串 s
和一个字符串数组 dictionary
,找出并返回 dictionary
中最长的字符串,该字符串可以通过删除 s
中的某些字符得到。
如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。
示例1:
输入:s = "abpcplea", dictionary = ["ale","apple","monkey","plea"]
输出:"apple"
示例2:
输入:s = "abpcplea", dictionary = ["a","b","c"]
输出:"a"
我的代码:
class Solution
{
public:
static bool cmp(string& a,string& b) //自定义排序规则
{
if(a.size()==b.size()) //size相等则按照字母序排序
return a<b;
else
return a.size()>b.size();
}
string findLongestWord(string s, vector<string>& dictionary)
{
sort(dictionary.begin(),dictionary.end(),cmp);
int len=s.size();
for(auto &c:dictionary)
{
int l=0,r=0,c_len=c.size();
while(l<len&&r<c_len)
{
if(s[l]==c[r])
++r;
++l;
}
if(r==c_len)
return c;
}
return "";
}
};
利用Lambda表达式精简后:
class Solution
{
public:
string findLongestWord(string s, vector<string>& dictionary)
{
sort(dictionary.begin(),dictionary.end(),[](string& a,string& b)
{
if(a.size()==b.size())
return a<b;
else
return a.size()>b.size();
}
);
int len=s.size();
for(auto &c:dictionary)
{
int l=0,r=0,c_len=c.size();
while(l<len&&r<c_len)
{
if(s[l]==c[r])
++r;
++l;
}
if(r==c_len) //当r==c_len时,说明dictionary里这个
return c; //字符串已经找到了,直接返回即可
}
return ""; //否则返回空字符串
}
};
涉及知识点:
1.双指针算法
双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多个数组的多个指针。
若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的区域即为当前的窗口),经常用于区间搜索。
若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是排好序的。
2.sort排序
思路:
因为题目说明有可能答案不一,我们与其找出所有答案再排序,不如先将dictionary里的string利用sort排序好,然后再利用双指针,一个指向s,一个指向dictionary里遍历到的字符串,来看看是否符合题目要求,若找到,因为已经排好序,直接返回即可,否则返回空字符串