【leetcode 524. 通过删除字母匹配到字典里最长单词】双指针在不同字符串中同向查找
链接地址:【leetcode 524. 通过删除字母匹配到字典里最长单词】双指针在不同字符串中同向查找
解题思路:
依旧是双指针,不过双指针在不同字符串中同向查找,且在使用双指针前需要对被查找集合做排序
1,根据题目要求,先将dictionary的字符串按照字符串的长度从大到小排序,且字符串符合字典序,进行排序,目的是为了接下查找时,dictionary中第一个符合条件字符串的即为题目要求的答案。
2,定义并初始化,字符串s的长度s_len,dictionary的长度d_len,dictionary中字符串的长度ds_len,指向字符串s的指针s_ptr,指向dictionary中第i个字符串的指针ds_ptr。
3,for循环遍历dictionary中所以字符串,获取当前dictionary中第i个的字符串的长度
4,while循环使用双指针,比较字符串s是否包含当前第i个dictionary中的字符串,
(1)如果包含,则d_ptr遍历到dictionary中第i个的字符串的末尾,即d_ptr == ds_len - 1,返回dictionary[i]即为答案,即返回长度最长且字典序最小的字符串。
(2)如果不包含,则d_ptr未遍历到dictionary中第i个的字符串的末尾,且s_ptr遍历到字符串s的末尾
5,退出当前while循环,即将遍历dictionary中的第i+1个字符串,双指针归零为下一个while循环做准备
6,如果退出for循环,则表示答案不存在,则返回空字符串。
代码:
class Solution {
public:
string findLongestWord(string s, vector<string> & dictionary) {
//字符串的长度从大到小排序,且字符串符合字典序
auto cmp = [&] (string& a, string& b)
{
if (a.size() == b.size()) {
return a < b;
}
return a.size() > b.size();
};
sort(dictionary.begin(), dictionary.end(), cmp);
int s_len = s.size(), d_len = dictionary.size(), ds_len = 0;
int s_ptr = 0, d_ptr = 0;
//双指针方法,遍历字典
for (int i = 0; i < d_len; ++i)
{
ds_len = dictionary[i].size(); //当前字典的字符串的长度
while (s_ptr < s_len && d_ptr < ds_len)
{
if (s[s_ptr] == dictionary[i][d_ptr]) //存在相等的字母
{
if (d_ptr == ds_len - 1) //且已经到达当前字符串的末尾,即存在,因为已经排序,所以第一个符合条件的即为答案
{
return dictionary[i];
}
//当前字典的字符串的下一个字母
++d_ptr;
}
//匹配被查找字符串的下一个字母
++s_ptr;
}
//比较字典的下一个字符串,被查找字符串的s_ptr归零
s_ptr = 0;
//进行字典的下一个字符串比较,d_ptr归零
d_ptr = 0;
}
return "";
}
};
如有不足之处,还望指正 [1]。
如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎