栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022-2-14 Leetcode 524.通过删除字母匹配到字典里最长单词

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022-2-14 Leetcode 524.通过删除字母匹配到字典里最长单词



我自己的方法:
1、依次从字典里取出每一个单词,在字符串 s 中进行查找。
查找的过程中可能出现的问题有:

字母出现多次,只找到最前面的字母,顺序上会有混乱字母都找到了,但是都是同一个字母

简而言之,会出现乱序(顺序不对)和重复的问题(次数不够)。
要解决这两个问题,只需要把查找到的字符之前的字符都删除掉就行了。

这样做可能会影响到效率的地方有:

删除的空间移动拷贝构造函数的多次调用

class Solution {
public:
    string findLongestWord(string s, vector& dictionary) {
        int maxlen = 0;
        string ret;
        for(auto & str:dictionary){
            if(str.size() > s.size())
            continue;
            int len = 0;
            string copy = s;
            for(auto& ch:str){
                
                int pos =copy.find(ch);
                if(pos != copy.npos){
                        copy.erase(0,pos+1);
                        len++;
                    }
                else break;
            }
            if(len == str.size()){
                if(maxlen < len){
                    maxlen = len;
                    ret = str;
                }
                else if(maxlen == len){
                    ret = (ret < str ? ret:str);
                }
            }
        }
        return ret;
    }
};

参考别人的写法
先对 dictionary 里面的单词进行排序,从长到短,相同长度的字符序在前面。

较长的单词,字典序号较小的单词放在前面,早搜索到早返回,能够节约时间。
(一个做题时候对字符串的处理能够节约时间的规律,把可能符合题目要求的单词放在前面)

使用双指针同时对 s 和 dictionary 里面的字符串进行比较。

双指针可以从两个字符串的单向进行。如果 s 中的单词不符合条件直接向前移动就好了。解决了查找的顺序不对,查找可能存在的重复查找的问题。没有多次拷贝和删除提升了效率

class Solution {
public:
    string findLongestWord(string s, vector& dictionary) {
        auto cmp = [&](const string &a,const string &b){
            if(a.size() == b.size())
            return a < b;//如果相同的长度就按照字典序列排序
            else return a.size() > b.size();
        };
        //如果没有就按照字符串较长的顺序排序,
        sort(dictionary.begin(),dictionary.end(),cmp);
        //将容器里面的按照长度排序
        int ps = 0,pd = 0,s_len = s.size();
        int dw_len = 0;
        for(int i = 0;i < dictionary.size();i++){//遍历字典中的字符串
            dw_len = dictionary[i].size();//获取每一个字符串中的长度
            while(ps < s_len && pd < dw_len){
                if(s[ps] == dictionary[i][pd]){
                    if(pd == dw_len - 1)
                    return dictionary[i];//返回找到的字符串
                    pd++;//当前字典中的指针移动到下一个
                }
                ps++;//匹配被查找字符串的下一个字符
            }
            ps = 0;
            pd = 0;
            //再重新进行字符串中下一个字符的比较的时候,将所有的指针移动到起点。
        }
        return "";
//这个题目有一个关键点是s字符串中的顺序比较,而不是其他的比较
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/738590.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号