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

Q:

在这里插入图片描述

A:

想到了先对整个数组重新排序,长度小的在前,长度一样的按字符串字典序从小到大排序。之后考察每个字符串就好了,找到一个,当前长度的就都跳过,直接考察长度+1的字符串。
然而蛋疼的是我考察每个字符串是否可以转化为目标字符串时用的是dfs。这题要求的是一个字符串a能转化为字符串b即可,而不是求a转化为b有多少种方法。后者肯定要递归回溯来算的,但这题只需要求是或不是。故只要找到a[i]和b[j]相同,就直接继续寻找a从i+1和b从j+1开始能不能转化就行。不必回溯再考察是否还有其他b[k] (k!=j)满足a[i]==b[k]。

代码:

class Solution {
public:
    static bool cmp(const string& s1,const string& s2)
    {
        if(s1.size()<s2.size() or s1.size()==s2.size() and s1<s2)
        {
            return true;
        }
        return false;
    }
    string findLongestWord(string s, vector<string>& d) 
    {
        sort(d.begin(),d.end(),cmp);
        string res="";
        for(int i=0;i<d.size();++i)
        {
            if(d[i].size()>res.size() and func(d[i],s))
            {
                res=d[i];
            }
        }
        return res;
    }
    bool func(string& s,string& target)	//复杂度O(M+N),M、N为两字符串长度
    {
        int i=0,j=0,siz1=s.size();
        while(i<siz1 and j<target.size())
        {
            if(s[i]==target[j])
            {
                ++i,++j;
            }
            else
            {
                ++j;
            }
        }
        return i==siz1;
    }
};
posted @ 2019-11-01 18:53  NeoZy  阅读(139)  评论(0)    收藏  举报