KY91 String Matching
KY91 String Matching
版本一:暴力解法
"版本一:暴力解法"import sys
for line in sys.stdin:line = line.strip()text, pattern = line.split(" ")cnt = 0while(True):pos = text.find(pattern)if pos != -1:cnt += 1text = text[pos+1:]else:breakprint(cnt)
KMP算法:
import sysdef getNext(pattern):length = len(pattern)assert length > 0next = [None] * lengthfor pointer in range(length):if pointer == 0: # 第一个位置取值恒为-1next[pointer] = -1continueelse:if pattern[pointer] == pattern[next[pointer-1]+1]: # 利用前一个位置的前后缀匹配关系判断下一个字符是否继续得到匹配next[pointer] = next[pointer-1] + 1 # 下一个字符仍然匹配,因此长度加1else:if next[pointer-1] == -1: # 表示截止到前一个字符,没有前后缀匹配,而且从上一个if语句得知当前字符也未匹配next[pointer] = -1 # 未得到匹配,取值为-1continue # 继续下一次循环,计算next数组的下一个取值scan = next[next[pointer-1]] # 当前匹配失败后,考虑前一个位置的前后缀匹配关系while(True): if pattern[scan+1] == pattern[pointer]: # 得到匹配next[pointer] = scan + 1 # 找到匹配的前后缀break # 跳出while循环else:if scan == -1: # 表示整个字符串中都未得到匹配,因此取值为-1next[pointer] = -1 # -1表示未得到匹配breakelse:scan = next[scan] # 匹配失败,继续前溯return next # 返回next数组# KMP函数接收一个文本字符串text和一个模式字符串pattern,实现KMP算法
def KMP(text,pattern): # 返回在文本字符串text中匹配子串的起始位置,若不匹配则返回Nonenext = getNext(pattern) # 获取next数组,列表类型length_txt = len(text) # 获得文本字符串的长度length_pat = len(pattern) # 获得模式字符串的长度ptr_txt, ptr_pat = 0, 0 # 初始化两个字符串的指针位置,或者理解为索引位置count = 0while(ptr_txt<length_txt and ptr_pat<length_pat): # 循环遍历整个文本字符串if pattern[ptr_pat] == text[ptr_txt]: # 字符获得匹配ptr_txt += 1 # 文本字符串的指针加1 ptr_pat += 1 # 模式字符串的指针加1if ptr_pat == length_pat: # 判断是否对模式字符串遍历完成count += 1ptr_txt, ptr_pat = ptr_txt-ptr_pat+1, 0# return (ptr_txt - ptr_pat) # 获得匹配,返回匹配的起始位置continue # 当前字符串成功匹配,继续进行下一次比较else:if ptr_pat == 0: # 模式字符串前溯到起始位置,仍旧未获得匹配的前缀后缀,因此将文本字符串指针向后移动ptr_txt += 1 # 文本字符串的指正位置向后移动,继续扫描两个字符串进行比较else:ptr_pat = next[ptr_pat-1] + 1 # 匹配失败之后前溯print(count) # 整个文本字符串中都未出现模式字符串,匹配失败,返回未匹配的标志Nonefor line in sys.stdin:text, pattern = line.strip().split(" ")KMP(text,pattern)
KY91 String Matching相关推荐
- 南阳5--Binary String Matching(Kmp)
Binary String Matching 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose alpha ...
- nyoj 题目5 Binary String Matching
Binary String Matching 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Given two strings A and B, whose alpha ...
- Binary String Matching
Binary String Matching 描述 Given two strings A and B, whose alphabet consist only '0' and '1'. Your t ...
- string matching(HDU-6629)
Problem Description String matching is a common type of problem in computer science. One string matc ...
- String Matching 字符串匹配算法——干货从头放到尾
需要的先验知识:动态规划,有限状态机,搜索算法(就是含有state,action和policy)的模型,java.上面这些不需要知道很细,大概懂这些都是啥就可以读懂本文. 写这篇技术博客的动机是因为做 ...
- NYOJ Binary String Matching的stl解法 酒馆浪人的博客
Binary String Matching 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 3 描述 Given two strings A and B, whose al ...
- HDU - 6629 string matching(扩展KMP)
题目链接:点击查看 题目大意:给出一个字符串 s 和一个暴力程序,用于求解 s 的每个后缀和原字符串的最长公共前缀,现在问一共需要执行多少次比较操作 题目分析:首先肯定不能暴力去模拟,时间复杂度n*n ...
- Binary String Matching(C++)
题目描述: Given two strings A and B, whose alphabet consist only '0' and '1'. Your task is only to tell ...
- CF954I Yet Another String Matching Problem 并查集、FFT
传送门 题意:给出两个由小写$a$到$f$组成的字符串$S$和$T$($|S| \geq |T|$),给出变换$c1\,c2$表示将两个字符串中所有$c1$字符变为$c2$,求$S$的每一个长度为$T ...
最新文章
- 防止MDI子窗体多次实例化的代码
- 软件学院学习体验之三
- nandflash与文件系统,oob区数据扫盲。后面还会补充实际生产烧录的心得体验,依据不同的文件系统
- Codeforces Round #304 (Div. 2) D. Soldier and Number Game 数学 质因数个数
- HTML5再曝漏洞 安全性遭质疑
- Raid0、Raid0+1、Raid1、Raid5四者的区别
- 【2019杭电多校第九场1002=HDU6681】Rikka with Cake(离散化+树状数组+思维)
- excel常用的数据处理方法
- 使用JAXB实现JAVA对象和XML字符串的互相转换
- linux下查找占空间大的文件,Linux中查找当前目录下占用空间最大的前10个文件
- 电商维权,维权方法汇总【超全】
- 飞机飞行与碰撞问题matlab,建模案例—飞行管理问题.ppt
- mfc 子窗口 跟随 主窗口
- 2022年危险化学品经营单位安全管理人员考题及答案
- 程序员为什么要学习算法?
- 软件加密系统Themida常见问题集锦—Themida是否支持命令行保护?
- 函数周期表丨时间丨表丨CALENDARAUTO
- 语音识别入门第五节:基于GMM-HMM的语音识别系统
- [论文笔记随手] Training with Weighted Sum of Denoising Score Matching Objectives
- 遗传算法求解八皇后问题—matlab