给出一个单词,在可以使用该单词形成的词典中找到最长的单词。
public static List<String> longestWord (String word, String[] dictionary) { }
我的方法是:
是否有更好的方法来解决此问题?
答案 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
,您应确保
key
或word1Map
出现在word2Map
value
或word1Map
小于或等于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)
您可以:
答案 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];
}
如果有任何错误或误解,请告诉我。
谢谢