我有一个在线自学家庭作业: 在字符列表中查找单词。
eg Input: COOL
List of characters: {A,B,C,O,L,M,O,L,F} return true
Input : Book
List of characters: {A,B,C,O,L,M,O,L,F} return false (as K is not present).
Note: C found at index 2, then O should be found at index > 2 (Linear searching, search from left to right).
I could think of two solutions, both brute force.
1. Using Brute force approach to get the output
2. Using Recursion (not sure if this approach is right, however, I am expected to solve it using dynamic programming).
不是动态编程方面的专家,所以请耐心等待。 我提出的解决方案:
public boolean found(final String input,int n, boolean isFound, int a, String words) {
if(n == input.length) {
return isFound;
}
char charValue = input.charAt(n);
for(int i = a; i<words.length-1; i++) {
if(charValue == words.charAt[i]) {
isFound = true;
return found(input, n+1, true, i+1; words);
}else {
isFound = false;
}
}
return isFound;
}
我不确定此解决方案是否有效,需要在IDE上尝试。但是,我希望通过动态编程解决这个问题。我没有看到我可以在缓存/内存中保存输入以便再次使用。
答案 0 :(得分:0)
为什么要进行动态编程?您想要查找字符列表中是否存在输入字。我会给你一个简单而有效的方法。
bool is_word_present(string word, vector<char> word_list ){
int word_index = 0;
int word_list_size = word_list.size();
int word_len = word.length();
for(int i = 0; i < word_list_size && word_index < word_len; i++){
if(word_list[i] == word[word_index]){
word_index++;
}
}
return word_index == word_len;
}
问题包含java
代码,我在这里提供了C++
代码。但是,当您对问题的算法部分感兴趣时,并不重要。此外,代码是不言自明的。
时间复杂度:O(n)其中n是字符列表中元素的数量。
空间复杂度:O(1)。
答案 1 :(得分:0)
将文件列表(例如来自The Oxford Dictionary)从文件加载到列表中。
当你经历它时,你将从这个列表中删除单词,所以从最后一个索引(长度为1)循环到第一个索引。
在该循环中有一个内部循环,遍历单词中的每个字母。如果当前字符不在允许字符列表中,则从列表中删除该单词并中断内循环。
我并不认为这是一个动态编程问题。如果您正在检查书中的所有单词,那么您可以将您检查的每个单词存储在通过哈希集或失败哈希集中,以便在处理每个字母之前查找它(即先前结果的内存缓存以便从中学习)。在这种情况下,它不会使它更快,它可能会减慢它,因为创建一个字符串的散列需要读取每个字符。
在C#中,您可以通过单个LINQ语句轻松实现此目的。
void Main()
{
string[] wordsToProcess = new string[] { "one", "two", "three", "bad", "cat", "dog" };
char[] charactersToAllow = new char[] { 'a', 'b', 'c', 'd', 'e', 't', 'o', 'g' };
List<string> qualifyingWords =
wordsToProcess
.Where(w => w.All(c => charactersToAllow.Contains(c)))
.ToList();
qualifyingWords.ForEach(Console.WriteLine);
}