在字符列表中查找单词

时间:2017-05-14 02:30:22

标签: algorithm

我有一个在线自学家庭作业: 在字符列表中查找单词。

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上尝试。但是,我希望通过动态编程解决这个问题。我没有看到我可以在缓存/内存中保存输入以便再次使用。

2 个答案:

答案 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);
}