字符串-通过删除字母匹配到字典里最长单词-双指针/动态规划

本文探讨了如何使用动态规划和双指针技巧解决LeetCode 524题,通过实例说明如何在给定字符串s和字典dictionary中找到最长的可以通过删除s中的字符得到的字典中的单词,同时确保字典序最小。两种算法实现对比,适用于字符串匹配和最长子序列问题。
摘要由CSDN通过智能技术生成

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

给你一个字符串 s 和一个字符串数组 dictionary 作为字典,找出并返回字典中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。

如果答案不止一个,返回长度最长且字典序最小的字符串。如果答案不存在,则返回空字符串。

示例 1:

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

示例 2:

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

双指针

思路

1.字符串是否含有dictionary

2.匹配长度最长且下标最小的字符串

s逐一检测是否含有dictionary的序列:当s和dictionary中字符串t元素相同即s[i]==t[j]时j++;否则只右移s的指针i。如果s完全包含t是在遍历结束时j == t.size()

此时比较该字符串是否符合第二个要求.

代码
class Solution {
public:
    string findLongestWord(string s, vector<string>& dictionary) {
        string res;
        for (string item : dictionary)
        {
            int pS = 0, pI = 0, sSize = s.size(), iSize = item.size();
            while (pS < sSize && pI < iSize)
            {
                if (s[pS] == item[pI])
                {
                    ++pI;
                }
               ++pS;
            }
            if ( pI == iSize && 
            (res.size() < item.size() ||
            (res.size() == item.size() && item.compare(res)<0)))
            {
                res = item;
            }
        }
        return res;
    }
};

动态规划

gan

思路
代码
string findLongestWord(string s, vector<string>& dictionary) {
    string res;
    int n = s.size();
    vector<int> address(26, n);
     //状态方程留出addressList[n]
    vector<vector<int>> addressList(n + 1, address);
    for (int i = n - 1; i >= 0; --i)
    {
        for (int j = 0; j < 26; ++j)
        {
            if (s[i] - 'a' == j)
            {
                addressList[i][j] = i;
            }
            else
            {
                addressList[i][j] = addressList[i+1][j];
            }
        }
    }
    for (string item : dictionary)
    {
        int pI = 0, pS = 0;
        while(pI < item.size())
        {
            if(addressList[pS][item[pI] - 'a'] == n)
            {
                break;
            }
            pS = addressList[pS][item[pI] - 'a'] + 1;
            ++pI;
        }
        if (pI == item.size() && (res.size() < item.size() || (res.size() == item.size() && item.compare(res) < 0)))
        {
            res = item;
        }
    }
    return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值