程序員面試金典 - 面試題 17.15. 最長單詞(排序+遞歸)

1. 題目

給定一組單詞words,編寫一個程序,找出其中的最長單詞,且該單詞由這組單詞中的其餘單詞組合而成。
如有多個長度相同的結果,返回其中字典序最小的一項,若沒有符合要求的單詞則返回空字符串。
網絡

示例:
輸入: ["cat","banana","dog","nana","walk","walker","dogwalker"]
輸出: "dogwalker"
解釋: "dogwalker"可由"dog""walker"組成。

提示:
0 <= len(words) <= 100
1 <= len(words[i]) <= 100

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/longest-word-lcci
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。

spa

2. 解題

  • 單詞可重複使用
  • 先按長度降序排列,長度相等,字典序小的在前
  • 從前日後找到第一個單詞便可
  • 將單詞拆分紅子串,遞歸判斷子串的子串
class Solution {
public:
    string longestWord(vector<string>& words) {
        if(words.size() < 2)
            return "";
        sort(words.begin(), words.end(),[&](auto a, auto b){
        	if(a.size() == b.size())
        		return a < b;
        	return a.size() > b.size();
        });
        int i, len;
        string ans, sub;
        unordered_set<string> set;
        for(i = 0; i < words.size(); ++i)
        	set.insert(words[i]);
        for(i = 0; i < words.size()-1; ++i)
        {
        	for(len = 1; len < words[i].size(); ++len)
        	{
        		sub = words[i].substr(0,len);
        		if(set.count(sub) && ok(words[i].substr(len), set))
        			return words[i];
        	}
        }
        return "";	
    }

    bool ok(string s, unordered_set<string> &set)
    {
        if(s=="")
            return true;
    	bool good = false;
    	for(int len = 1; len <= s.size(); ++len)
    	{
    		string sub = s.substr(0,len);
    		if(set.count(sub) && ok(s.substr(len),set))
    		{
    			good = true;
    			break;
    		}
    	}
    	return good;
    }
};

48 ms 12.7 MBcode

相關文章
相關標籤/搜索