class Solution(object):
def strStr(self, haystack, needle):
"""
:type haystack: str
:type needle: str
:rtype: int
"""
return self.search(haystack, needle)
def get_dfa(self, pat):
M = len(pat)
# dp[状态][字符] = 下个状态
dp = [[0] * 256 for _ in range(M)]
# base case
dp[0][ord(pat[0])] = 1
# X实际上表示模式串pat[:j]的匹配状态。
# 比如模式串
# 'ababdababa'
# 则X依次为:
# current_state(j) 1 2 3 4 5 6 7 8 9
# X 0 0 1 2 0 1 2 3 4
X = 0
for j in range(1, M):
for c in range(0, 256):
if c == ord(pat[j]):
dp[j][c] = j + 1
else:
dp[j][c] = dp[X][c]
X = dp[X][ord(pat[j])]
return dp
def search(self, txt, pat):
if not pat:
return 0
if not txt:
return -1
M = len(pat)
N = len(txt)
dfa = self.get_dfa(pat)
state = 0
for j in range(N):
# 计算 pat 的下一个状态
state = dfa[state][ord(txt[j])]
if state == M:
return j - M + 1
# 没到达终止态,匹配失败
return -1
字符串匹配-构造DFA
最新推荐文章于 2026-04-21 10:52:31 发布
本文深入探讨了如何使用确定有限状态自动机(DFA)进行字符串匹配。通过详细解释DFA的构造过程,阐述了其在文本搜索和模式匹配中的应用,帮助读者理解如何利用DFA高效地实现字符串查找操作。

601

被折叠的 条评论
为什么被折叠?



