【问题标题】:Forming a given word, using the words of a given word list使用给定单词列表中的单词形成给定单词
【发布时间】:2021-03-17 15:43:32
【问题描述】:

我有一个 target_word,比如 'aaaaaaa',还有一个单词列表 ['aa', 'aaa']。问题是发现是否可以使用多个单词或单词列表中的至少一个单词的串联来形成给定的单词。 (列表中的每个单词都可以无限次使用)。

约束:

length of the list of words<=10^3

在上面的例子中:

aaaaaaa = aa + aa + aaa

我的方法是贪婪地检查给定单词列表中最长的单词是否存在。但我怀疑这可能不是一个好方法。

我按照单词长度递减的顺序对列表进行排序。 list=['aaa', 'aa'] 然后迭代检查给定目标词中是否存在该词。

target_word= target_word.replace("aaa", "")

并以类似的方式继续。 提前致谢

【问题讨论】:

  • 也许可以告诉你的方法并要求改进my approach is to go greedy 没有提出任何具体建议。
  • @YashvanderBamel 我添加了,请查看
  • 您的方法将给出错误的结果,即我们是否可以从单词 'bb' 和 'aaa' 中产生 'baaab'。相反,您能否生成一个缓慢但保证正确的递归算法?然后想办法不重做同样的逻辑,让它变快?
  • @btilly我已经想到了递归,但这会给出 2^1000 的复杂度,这是不切实际的。
  • 你考虑过使用数据结构Trie吗?

标签: python string algorithm data-structures


【解决方案1】:

Trie + 回溯

  1. 用列表中的单词构造一个 trie。

  2. 将给定的字符串添加到队列中。将标志设置为假。 直到队列为空

2.1 将顶部元素作为当前字符串 2.2 在trie中获取当前字符串搜索中的每个字符。 2.3 如果在trie中遇到词尾,将当前字符串的剩余部分加入队列。 2.4.1 如果不匹配或最后一个字符不是单词的结尾,则退出比较并转到队列的下一个元素。 2.4.2 如果匹配到当前字符串的末尾并且trie中存在单词的eod,则将标志更改为true并退出。

  1. 返回标志

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-01
    • 2021-09-19
    • 2016-10-07
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2021-10-23
    相关资源
    最近更新 更多