在KMP基础上添加最大子串匹配功能
2018-03-26 09:31
330 查看
''' kmp algorithm for string 在字符串匹配的基础上添加了匹配最大长度子串的功能 ''' def match_KMP(target, pattern, pnext): t_len, p_len = len(target), len(pattern) i, j = 0, 0 max_pattern = [0]*t_len while i < t_len and j < p_len: if j == -1 or target[i] == pattern[j]: i, j = i+1, j+1 max_pattern[i-1] = j else: j = pnext[j] if j == p_len: pass return max_pattern #每个位置都记录target当前已经匹配的最大字符串数目 def gen_pnext(pattern): p_len = len(pattern) i, j = 0, 0 pnext = [-1]*p_len while i < p_len -1: if j == -1 or pattern[i] == pattern[j]: i, j = i+1, j+1 if pattern[i] == pattern[j]: pnext[i] = pnext[j] #如果i, j位置上字符相同,则i+1位置上回退时必然和j+1一致 else: pnext[i] = j else: j = pnext[j] return pnext if __name__ == "__main__": target = "asdfghjlqwerthjyhjlgsdjlra" pattern = "hjlra" max_len = 0 #最大长度,用来存放匹配到的最大子串的长度 max_str = 0 #最大子串 for i in range(len(pattern)-1): pattern = pattern[i:len(pattern)] pnext = gen_pnext(pattern) eval1 = match_KMP(target, pattern, pnext) print(eval1) print("%d"%max(eval1)) if max(eval1) > max_len: #更新最大长度 max_len = max(eval1) i = 0 while i < len(target): if eval1[i] == max_len: max_str = target[(i - max(eval1) + 1):i + 1]#更新最大子串 i += 1 print(max_str)
相关文章推荐
- hdu 1003 基础dp:最大字连续子串和
- HDU 1711 Number Sequence (KMP找子串第一次出现的位置)(基础模板题)
- 中文分词基础原则及正向最大匹配法、逆向最大匹配法、双向最大匹配法的分析
- hdu 2063 过山车(二分图最大匹配基础)
- 在昨天作业的基础上添加 :删除按钮,修改并保存按钮 和 添加按钮。完成这些按钮所对应的功能/新建页面DataXML,使用GridView显示book.xm中的图书信息
- 算法--最大相同子串匹配
- JAVA编写的浏览器,在别人的基础上做了些许修改,实现了前进,后退,刷新功能,添加了一个搜索框,具体情况在运行结果中的文件-->注意中
- java基础-找出两个字符串相同的最大子串
- hdu 2063 过山车 基础最大二分匹配
- 经典算法研究:模式匹配(子串匹配)之 KMP 算法(C语言实现版)
- 【hihocoder】KMP子串数目匹配
- poj 1274 基础二分最大匹配
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 【数据结构】 字符串&KMP子串匹配算法
- poj 1274 基础二分最大匹配
- 【CROC 2016 - Elimination RoundE】【DP】Intellectual Inquiry 长度为m字符串后添加n位最大本质不同子串个数
- 3461 Oulipo 计算a中多少个与b匹配的子串 两个KMP模板
- java基础-StringBuffer(常见功能—添加、删除和修改)
- KMP子串匹配查找算法