1. 状态机与单词统计的奇妙结合
第一次听说用状态机做单词统计时,我正坐在工位上调试一个复杂的业务逻辑。当时的第一反应是:"杀鸡用牛刀?"毕竟在大多数程序员的认知里,单词统计不就是用split()按空格切分字符串吗?直到我在处理一段包含多种分隔符的文本时,才真正体会到状态机的精妙之处。
状态机(Finite State Machine)本质上是对事物行为的一种抽象建模。在单词统计的场景中,我们可以将文本解析过程抽象为在不同状态间的转换:比如从"非单词字符"状态切换到"单词字符"状态时,就触发计数器加一。这种思维方式特别适合处理边界条件复杂的文本解析问题——想想看,当文本中出现连续空格、标点符号、换行符时,传统的基于分隔符的统计方法有多容易出错。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 状态机模型设计
2.1 状态定义
在单词统计的场景中,我们只需要两个基本状态:
- OUT_WORD:当前字符处于单词之外(空格、标点等分隔符)
- IN_WORD:当前字符属于某个单词的一部分(字母、数字等有效字符)
python复制class State(Enum):
OUT_WORD = 0
IN_WORD = 1
2.2 状态转移规则
状态机的核心在于明确定义状态间的转换条件。对于单词统计:
-
当处于OUT_WORD状态时:
- 遇到字母/数字 → 转入IN_WORD状态,单词计数+1
- 遇到其他字符 → 保持OUT_WORD状态
-
当处于IN_WORD状态时:
- 遇到字母/数字 → 保持IN_WORD状态
- 遇到其他字符 → 转回OUT_WORD状态
注意:这里对"单词字符"的定义可以根据需求调整,比如是否包含数字、下划线等
3. 基础实现方案
3.1 纯代码实现
最直接的实现方式是用标志变量模拟状态:
python复制def word_count(text):
count = 0
state = State.OUT_WORD
for char in text:
if char.isalnum(): # 当前是单词字符
if state == State.OUT_WORD:
count += 1
state = State.IN_WORD
else: # 当前是非单词字符
state = State.OUT_WORD
return count
3.2 状态表驱动实现
对于更复杂的需求,可以采用表驱动的方式:
python复制transition_table = {
State.OUT_WORD: {
'is_word_char': (State.IN_WORD, lambda cnt: cnt + 1),
'not_word_char': (State.OUT_WORD, lambda cnt: cnt)
},
State.IN_WORD: {
'is_word_char': (State.IN_WORD, lambda cnt: cnt),
'not_word_char': (State.OUT_WORD, lambda cnt: cnt)
}
}
def word_count(text):
state = State.OUT_WORD
count = 0
for char in text:
transition_type = 'is_word_char' if char.isalnum() else 'not_word_char'
new_state, update = transition_table[state][transition_type]
