【2025刷题笔记】- 语言分析器
刷题笔记合集🔗
语言分析器
问题描述
A小姐正在开发一个语言分析器,用于处理连续的文本并将其分解成有意义的单词。给定一个连续不包含空格的字符串,该字符串仅包含英文小写字母及英文标点符号(逗号、分号、句号),同时给定词库,需要对该字符串进行精确分词。
分词需遵循以下规则:
- 精确分词:字符串分词后,不会出现重叠。例如"ilovechina",可分割为"i,love,china"或"ilove,china",但不能分割为出现重叠的"i,ilove,china",因为"i"出现重叠。
- 标点符号不成词,仅用于断句。
- 分词原则:采用分词顺序优先且最长匹配原则。
例如,对于字符串"ilovechina",假设分词可能结果有 [i,ilove,lo,love,ch,china,lovechina],则正确输出应该是 [ilove,china]。
错误输出示例:
- [i,lovechina],原因:"ilove" 优先于 "lovechina" 成词
- [i,love,china],原因:遵循最长匹配原则,"ilove" 优先于 "i"
输入格式
第一行输入待分词语句,如 "ilovechina"。
- 字符串长度限制:
第二行输入词库,如 "i,love,china,ch,na,ve,lo,this,is,this,word"。
- 词库长度限制:
输出格式
按顺序输出分词结果,如 "i,love,china"。
样例输入
ilovechina
i,love,china,ch,na,ve,lo,this,is,the,word
iat
i,love,china,ch,na,ve,lo,this,is,the,word,beauti,tiful,ful
ilovechina,thewordisbeautiful
i,love,china,ch,na,ve,lo,this,is,the,word,beauti,tiful,ful
样例输出
i,love,china
i,a,t
i,love,china the,word,is,beauti,ful
数据范围
- 字符串长度:
- 词库长度:
| 样例 | 解释说明 |
|---|---|
| 样例1 | 按照最长匹配原则,先匹配"i",然后匹配"love",最后匹配"china"。 |
| 样例2 | 字母"a"和"t"不在词库中且不成词,因此按单个字母输出。 |
| 样例3 | 标点符号","用于断句,将输入分为两个部分处理。 |
题解
这道题目要求我们实现一个语言分析器,根据给定词库对文本进行分词,需要遵循分词顺序优先和最长匹配原则。
问题分析
首先,我们需要明确两个关键概念:
- 分词顺序优先:是指从左到右处理文本
- 最长匹配原则:是指在当前位置,尽可能匹配最长的词
这两个原则结合就意味着:我们需要从文本开头开始,在当前位置尝试匹配最长的有效词,然后继续处理剩余文本。
实现思路
我们可以使用贪心算法来解决这个问题:
- 首先处理标点符号,将文本分成多个子句
- 对每个子句执行以下操作:
- 从当前位置开始,尝试匹配最长的有效词
- 如果找到匹配的词,将其添加到结果中,并移动当前位置
- 如果找不到匹配的词,则将当前字符作为单个字母添加到结果中,并前进一个位置
这种方法保证了我们始终按照从左到右的顺序处理文本,并且在每个位置都尽可能匹配最长的词。
边界情况处理
在实现中,我们需要注意以下几点:
- 处理标点符号时,需要确保它们只用于断句
- 当在词库中找不到匹配项时,需要输出单个字母
- 需要正确处理空字符串或其他边界情况
时间复杂度分析
假设文本长度为 n,词库大小为 m,每个词的平均长度为 k,则:
- 在最坏情况下,对于每个位置,我们需要检查长度从 n 到 1 的所有可能子串是否在词库中
- 使用哈希集合可以将查找操作的复杂度降低到 O(1)
- 总时间复杂度约为 O(n²)
在实际应用中,由于词的长度往往有限,性能通常会好得多。
参考代码
- Python
import sys
import re
input = lambda:sys.stdin.readline().strip()
def word_segmentation(sentences, word_dict):
# 转换词库为集合以便快速查找
word_set = set(word_dict)
# 存储最终结果
result = []
# 处理所有句子
for sentence in sentences:
pos = 0
while pos < len(sentence):
# 尝试找到最长匹配
found = False
for end in range(len(sentence), pos, -1):
if sentence[pos:end] in word_set:
result.append(sentence[pos:end])
pos = end
found = True
break
# 如果没有找到匹配,输出单个字符
if not found:
result.append(sentence[pos])
pos += 1
return ",".join(result)
# 读取输入
text = input()
word_dict = input().split(",")
# 按标点符号分割句子
sentences = re.split(r'[,.;]', text)
sentences = [s for s in sentences if s] # 去除空字符串
# 输出结果
print(wo
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记