2021-05-31通过删除字母匹配到字典里最长单词

本文介绍了一道LeetCode上的编程问题,要求从给定字符串s通过删除字符得到字典中的最长字符串。解题思路是检查每个字典单词是否为s的子序列,并比较长度和字典序。最终找到最长且字典序最小的字符串。作者分享了自己的解题代码,并反思了简化判断字典序的方法。
摘要由CSDN通过智能技术生成

题目描述

力扣

给你一个字符串 s 和一个字符串数组 dictionary 作为字典,找出并返回字典中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字典序最小的字符串。如果答案不存在,则返回空字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题

要命了,我这瞎写的,麻烦死了

class Solution {
public:
//判断在字符串s中,是否按顺序存在目标字符串的所有字母
    bool ifExist( string s, string sub)
    {
        if(s.size() < sub.size())   return false;
        int temp = 0;

        vector<string> cur;
        for(int i = 0;i<sub.size();i++)
        {
           int cur = temp;
           for(int j = temp;j<s.size();j++)
           {
               if(s[j] == sub[i])
               {
                   temp = j+1;
                   break;
               }
           }
           if(cur == temp){
               return false;
           }
        }
        return true;
    }

    string findLongestWord(string s, vector<string>& dictionary) {
        //对dictionary中的每一个字符串,拿到字符串s中遍历,若每个字母在s中都能找到,则返回该字符串
        vector<int> v;
        string max ="" ;
        for(int i = 0;i<dictionary.size();i++)
        {
            if(ifExist(s,dictionary[i])){
                v.push_back(i);
            }
        }
        if(v.empty()){
            return "";
        }
        for(int j = 0;j<v.size();j++)
        {
            int k = v[j];
            //if(max.size()<dictionary[k].size() || max.size() == dictionary[k].size()&& max > dictionary[k] )	改成这样就对咯
            if(max.size()<dictionary[k].size()){
                max = dictionary[k];
            }
        }
        return max;
    }
};

只能返回最长的,做不到返回字典序最小的
wocao,字典序就是字符串最小的,在判断语句改成if(max.size()<dictionary[k].size() || max.size() == dictionary[k].size()&& max > dictionary[k] )这样就可以了

贴一段别人的代码

class Solution {
private:
    // src是否包含dst这个子序列
    bool IsSubsequence(string src, string dst)
    {
        int ns = src.size();
        int nt = dst.size();
        int i = 0;
        int j = 0;
       // 顺序遍历src,找出dst中的字母
        for (; i < ns && j < nt; ++i)
        {   //若找到了,则在src剩下的字符串中寻找dst中下一位字母
            if (src[i] == dst[j])
            {
                ++j;
            }
        }
    //若src包含dst,则循环结束时 j==nt
        return j == nt;
    }
public:
    string findLongestWord(string s, vector<string>& dictionary) {
        // 保存最大的结果
        string res = "";
        for (string dst : dictionary)
        {
            if (IsSubsequence(s, dst))
            {
                // 找到更长的 或者 一样长但是字典序更小
                if ((dst.size() > res.size()) || (dst.size() == res.size() && dst < res))
                {
                    res = dst;
                }
            }
        }

        return res;
    }
};

感觉自己就是个沙雕,简单的问题写的这么麻烦,我丢,字典序最小不就是字符串最小嘛?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>