专栏首页技术向通过删除字母匹配到字典里最长单词

通过删除字母匹配到字典里最长单词

leetcode题号:524

题目

给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。

示例 1:

输入:
s = "abpcplea", d = ["ale","apple","monkey","plea"]

输出: 
"apple"

示例 2:

输入:
s = "abpcplea", d = ["a","b","c"]

输出: 
"a"

说明:

  • 所有输入的字符串只包含小写字母。
  • 字典的大小不会超过 1000。
  • 所有输入的字符串长度不会超过 1000。

临时解法

还是使用哈希表存储字典,然后逐个删除原字符串的某个字符,再递归。 简单的字符串还行,长字符串容易超时。

class Solution {
public:
    bool found = false;
    string res;
    void myfind(string s, unordered_map<string, int> &myhash){
        if(s.size() > 0){
            for(int i = 0; i < s.size(); i++){
                
                auto ptr = myhash.find(s);
                if(ptr != myhash.end()){
                    res = ptr->first.size() > res.size() ? ptr->first : res;
                    found = true;
                }else{
                    string temp_str = s.substr(0, i) + s.substr(i + 1, s.size() - 1 - i);
                    myfind(temp_str, myhash);
                } 
            }
        }
    }
    string findLongestWord(string s, vector<string>& d) {
        unordered_map<string, int> myhash;
        sort(d.begin(), d.end());
        for(int i = 0; i < d.size(); i++) myhash.insert(pair<string, int>(d[i], i));
        myfind(s, myhash);
        return res;
    }
};

有两处做的不够好,一处是使用了递归,导致递归时的时间复杂度变为O(26^n). 第二处是字典序的处理上,虽然进行了排序,但在逐个删除字符寻找匹配时却不是按照字典序,所以字典序相当于没有处理。

下面的解法一是参考题解中的答案,有参考价值。

解法一

class Solution {
public:
    bool found = false;
    string res;
    // 给原始字符串,看某个单词是否match
    string mymatch(string s, string mydict){
        int i, j;
        for(i = 0, j = 0; i < s.size() && j < mydict.size(); ){
            if(s[i] == mydict[j]) j++;
            i++; 
        }
        return j == mydict.size() ? mydict : "";
    }
    string findLongestWord(string s, vector<string>& d) {
        string res;
        for(auto m : d){
            string temp = mymatch(s, m);
            if(temp.size() > res.size()) res = temp;
            else if(temp.size() == res.size()){
                if(temp < res) res = temp;
            }
        }
        return res;
    }
};

优点一:自定义match函数,做删除字符的匹配,时间复杂度估计为 O(字典数组的大小 x min(字符串长度, 字典长度));

思考:leetcode将此题列为与最长前缀树相关的题目,是不是可以用最长前缀树解决此题呢?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python代码的奇淫巧技

    如果settings[key]='value',那么本地print(key)不会报错,而是输出'value'

    羽翰尘
  • python高阶教程-命名空间与作用域

    本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/zhuanlan-senior-python-2/

    羽翰尘
  • python3 rsa非对称加密与签名校验

    本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/article/python-rsa/

    羽翰尘
  • leetcode 6 ZigZag Converesion

    @坤的
  • 从台积电病毒事件看工控安全

    8月3日晚,台机电部分机房受到病毒感染,导致3大生产基地短期间停工,无法进行生产,带来了极大的损失。

    安恒信息
  • 【简单的CV】2.0 滤波、核与卷积(上)

    遍历是是指将集合中的元素全部列举一次。在图像集合中即表示将图像的所有像素点全部列举一次。

    EdenChen
  • 工控系统网络安全,一场没有硝烟的战争

    2018年8月,世界500强的半导体制造公司台积电生产园区电脑遭大规模病毒入侵,导致新竹、台中、台南三大生产基地全线停工,损失高达17.4亿元。而造成如此轰动的...

    SDNLAB
  • 详解安恒“PMPE”工控安全防护技术体系

    随着两化融合、工业4.0、工业物联网的快速发展,工业化与信息化的融合趋势越来越明显,工业控制系统也在利用最新的网络技术来提高系统间的集成、互联以及信息化管理水平...

    安恒信息
  • Python - os.walk()详细使用

    os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

    小菠萝测试笔记
  • FFmpeg数据结构AVPacket

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10410320.html

    用户4940323

扫码关注云+社区

领取腾讯云代金券