【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循环,则表示答案不存在,则返回空字符串。

图片.png

代码:

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]


  1. 如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎

posted @ 2021-06-03 11:27  CoutCodes  阅读(61)  评论(0编辑  收藏  举报