【华为机试题】 [Python] 英文输入法

题目

"""
问题描述
K小姐是一家科技公司的产品经理,她最近负责开发一款英文输入法。其中一个重要功能是单词联想,即根据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,并按字典序输出联想到的单词序列。如果无法联想到任何单词,则输出用户输入的单词前缀。

在实现这个功能时,需要注意以下几点:

英文单词联想时区分大小写。
缩略形式如 "don't" 应被视为两个单词 "don" 和 "t"。
输出的单词序列中不能有重复单词,且只能包含英文单词,不能包含标点符号。
输入格式
输入包含两行:

第一行是一个由英文单词word
word 和标点符号组成的语句str

第二行是一个英文单词前缀𝑝𝑟𝑒

输出格式
输出符合要求的单词序列或单词前缀,如果有多个单词,则用单个空格分隔。

样例输入1
I love you
He
样例输出1
He

样例输入2
The furthest distance in the world, ls not between life and death, But when I stand in front of you, Yet you don't know that I love you.
f
样例输出2
front furthest
"""

代码


class Solution:
    def func(self, word
### 处理英文输入法问题 在华为OD环境中使用Python处理英文输入法问题主要涉及基于给定的前缀从一段文本中查找匹配的单词并按照字典顺序返回这些单词。下面是一个详细的解决方案[^2]。 #### 解决方案概述 为了实现这一功能,可以采用Trie树(前缀树)数据结构来高效存储和查询字符串集合中的所有单词。对于每一个新输入的字符,程序会尝扩展当前路径以找到可能完成整个单词的所有选项,并最终输出符合条件的结果列表。当没有任何节点能够继续延伸时,则仅打印最初给出的那个部分作为提示信息。 #### 实现方法 以下是具体的算法描述: 1. 构建一个包含所有可能出现单词的数据结构——这里推荐使用`Trie`; 2. 对于每次新的查询请求,在构建好的trie上沿着对应分支向下遍历直到不能再前进为止; 3. 收集此时所在位置及其子树内所有的叶子结点所代表的完整词语; 4. 将收集到的结果按字母表升序排列后输出;如果没有找到任何完整的词则直接显示原始前缀。 下面是该逻辑的具体代码实现: ```python class TrieNode: def __init__(self): self.children = {} self.is_end_of_word = False def insert(root, word): node = root for char in word: if char not in node.children: node.children[char] = TrieNode() node = node.children[char] node.is_end_of_word = True def search_prefix(node, prefix, result): if node.is_end_of_word: result.append(prefix) for char, child_node in sorted(node.children.items()): search_prefix(child_node, prefix + char, result) def find_words_with_prefix(trie_root, prefix_string): current_node = trie_root # Traverse the trie to reach the end of the given prefix. for character in prefix_string: if character in current_node.children: current_node = current_node.children[character] else: return [prefix_string] found_words = [] search_prefix(current_node, prefix_string, found_words) if not found_words: return [prefix_string] return sorted(found_words) if __name__ == "__main__": sentences = "the quick brown fox jumps over lazy dog".split() trie_root = TrieNode() for sentence in sentences: words = sentence.split() for word in words: insert(trie_root, word.lower()) test_cases = ["th", "quic", "brow", "f"] results = [] for case in test_cases: output = find_words_with_prefix(trie_root, case) print(f"Prefix '{case}' suggests: {output}") ``` 此段代码首先定义了一个简单的Trie类用于表示单个节点以及其连接关系。接着实现了两个辅助函数:一个是用来向Trie中添加新词条的方法 `insert()` ,另一个是用来递归地寻找特定前缀下的全部候选词汇的方法 `search_prefix()` 。最后通过主函数展示了如何利用上述组件解决问题实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特本特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值