给定一个单词,在字典中找到最长的单词,该单词可以使用传递的单词形成

时间:2018-09-18 09:03:15

标签: java algorithm

给出一个单词,在可以使用该单词形成的词典中找到最长的单词。

public static List<String> longestWord (String word, String[] dictionary) { }

我的方法是:

  1. 找到单词的所有排列
  2. 将这些排列与Dictionary数组中的单词匹配

是否有更好的方法来解决此问题?

3 个答案:

答案 0 :(得分:1)

问题似乎是家庭作业,这就是为什么让我提供代码,但提供想法的原因。

首例

如果我们可以使用字母 partially 例如汽车可以来自 a bra c dab r a

将字典中的所有单词转换为Map<Character, Integer>,其中key-单词的字符,value-出现的次数。

例如:

"abracadabra"应该变成

  'a' : 5 // "abracadabra" contains 5 'a's 
  'b' : 2 // ..                     2 'b's
  'c' : 1 // ..                     1 'c'
  'd' : 1
  'r' : 2

word转换为相同的Map<Character, Integer>结构,例如"arcada"

  'a' : 3
  'c' : 1
  'd' : 1
  'r' : 1

要测试word1是否可以构成word2,您应确保

  1. 每个keyword1Map出现在word2Map
  2. 每个对应的valueword1Map小于或等于word2Map

例如word1 = "arcada"是否可以由words2 = "abracadabra"组成?

 key   word1value word2value 
 'a'            3          5  3 <= 5? true 
 'c'            1          1  1 <= 1? true
 'd'            1          1  1 <= 1? true
 'r'            1          2  1 <= 2? true
 -----------------------------------------
                                      true: can be formed

现在,通过简单的字典循环即可解决问题

第二种情况

如果您不能使用字母 patialy ,例如"car"可以由"arc"组成,但不能由"card"

组成

该算法非常简单:对字典中每个单词中的所有字母进行排序:

 "car"         -> "acr"
 "card"        -> "acdr"

 "abracadabra" -> "aaaaabbcdrr"

 "art"         -> "art"
 "rat"         -> "art"
 "tar"         -> "art"

对给定的word执行相同的操作,例如"arc" -> "acr"并在字典中循环查找相等的转换词:

 "car" -> "acr" == "acr" (from "arc") so "car" can be formed from "arc"

注意

 "abracadabra" -> "aaaaabbcdrr" != "acr" (from "arc") 

所以现在"arc"可以由"abracadabra"组成

答案 1 :(得分:0)

您可以:

  1. 将字典中的单词叠起来,对单词中的字符进行排序并删除重复的字符。
  2. 将单词存储在哈希图中,其中键是单词的排序字符,而值是具有相同唯一排序字符的单词列表。
  3. 在搜索时,对输入单词中的字符进行排序,删除重复项,并将其用作在哈希图中搜索的键。
  4. 从列表中找到字符数最多的单词。

答案 2 :(得分:0)

我们还可以使用额外的空间来解决此问题:

首先创建unordered_map ..在地图中插入所有字符串字符。

对每个字典单词使用循环,并检查地图中是否存在字典单词的所有字符。

如果地图中所有字符都存在,则将该词典单词插入向量中(使用额外的字符串空间矢量来存储具有相同字符(如字符串)的单词)

根据字符串长度对向量进行排序。

下面是C ++代码:

 bool checkAllCharacters(string s, unordered_map<char,int> mp)
   {
        int i=0;
        while(s[i]!='\0')
       {
            if(mp.find(s[i])==mp.end())
               return false;
            
            i++;
       }
    
       return true;
    }
    bool comp(string a, string b)
    {
        return a.length() > b.length();
    }

string longestWord(string s, vector<string> dict)
{
    unordered_map<char,int> mp;
    
    vector<string> matchWords;
    
    for(int i=0; i<s.length();i++)
    {
        mp[s[i]]++;
    }
    
    for(int i=0; i<dict.size(); i++)
    {
        if(checkAllCharacters(dict[i],mp))
            matchWords.push_back(dict[i]);
    }
    
    sort(matchWords.begin(), matchWords.end(), comp);
    
    return matchWords[0];
}

如果有任何错误或误解,请告诉我。

谢谢