LeetCode 面试题 17.15. 最长单词 -- map+dfs

57 篇文章 0 订阅
5 篇文章 0 订阅

面试题 17.15. 最长单词

给定一组单词words,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。若有多个长度相同的结果,返回其中字典序最小的一项,若没有符合要求的单词则返回空字符串。

示例:

输入: [“cat”,“banana”,“dog”,“nana”,“walk”,“walker”,“dogwalker”]
输出: “dogwalker”
解释: "dogwalker"可由"dog"和"walker"组成。

提示:

0 <= len(words) <= 200
1 <= len(words[i]) <= 100

题解

这个题目,,,卡了我很久,为啥呢?因为题目没说清楚一个单词能否被多次使用,好家伙,我就一直以为是每个单词只能被使用一次,,,,

AC代码

class Solution {
public:
    map<string,int>count;
    static int cmp(string s1,string s2)
    {
        if(s1.length()>s2.length())return true;
        if(s1.length()==s2.length())return s1<s2;
        return false;
    }
    bool check(string s,int l)
    {
        if(l==s.length())return true;
        string res = "";
        for(int i=l;i<s.length();i++)
        {
            res += s[i];
            if(count.find(res)!=count.end()&&count[res]>0)
            {
                //count[res]--;
                bool back = check(s,i+1);
                //count[res]++;
                if(back)return true;
            }
        }
        return false;
    }
    string longestWord(vector<string>& words) 
    {
        sort(words.begin(),words.end(),cmp);
        for(int i=0;i<words.size();i++)
        {
            count[words[i]]++;
        }        
        for(int i=0;i<words.size();i++)
        {
            count[words[i]]--;
            if(check(words[i],0))return words[i];
            count[words[i]]++;
        }
        return "";
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值