String Matching -- Brute Force + Rabin-Karp + KMP

2024-06-06 09:32

本文主要是介绍String Matching -- Brute Force + Rabin-Karp + KMP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

String Matching





这个问题已经被做烂了...

下面是C语言实现集合.

http://www-igm.univ-mlv.fr/~lecroq/string/

留个爪~






暴力解法:

     

暴力美啊~

"""
Programmer  :   EOF
Date        :   2015.02.28
Code file   :   nsm.py"""def naive_string_matcher(T, P) :if (T or P) is None :return n = len(T)m = len(P)for s in range(0, n-m+1) :match = Truefor i in range(0, m) :if P[i] is not T[s+i] :match = Falsebreakif match is True :print "Pattern occurs with shift", s#------------ for testing --------------------string1 = "hello goodbye and hello"
string2 = "hello"
naive_string_matcher(string1, string2)



Rabin-Krap :

"""
Programmer  :   EOF
Code date   :   2015.02.28
Code file   :   rkm.py
e-mail      :   jasonleaster@gmail.com"""
def rabin_karp_matcher(T, P, d, q) :n = len(T)m = len(P)h = d**(m-1) % qp = 0t_0 = 0t = [0 for i in range(0, n - m + 1)]# preprosecessingfor i in range(0, m) :p = ( d*p + ord(P[i]) ) % qt[0] = (d*t[0] + ord(T[i])) % q# matchingfor s in range(0, n-m+1) :match = Trueif p is t[s] :for i in range(0, m) :if P[i] is not T[s+i] :match = Falsebreakif match is True :print "Pattern occurs with shift", sif s < n-m :t[s+1] = (d * ( t[s] - ord(T[s]) * h ) + ord(T[s+m]) ) % q#------------ for testing --------------------string1 = "hello goodbye and hello"
string2 = "hello"
rabin_karp_matcher(string1, string2, 10, 13)



KMP:

"""
Programmer  :   EOF
Code date   :   2015.02.28
Code file   :   kmp.py
e-mail      :   jasonleaster@gmail.comCode description    :Here is a implementation of KMP which is a useful
algorithm for string matching."""def kmp_matcher(T, P) :n = len(T)m = len(P)pi = compute_prefix_function(P)q = -1 # number of characters matchedfor i in range(0, n) : # scan the text from left to rightwhile q > 0 and P[q+1] != T[i] :q = pi[q]       # next character doesn't matchif P[q+1] == T[i] :q += 1          # next character matchesif (q+1) == m :         # Is all of P matched ?print "Pattern occurs with shift ", i-mq = pi[q]       # look for the next matchdef compute_prefix_function(P) :m = len(P)pi = [-1 for i in range(0, m)]k = -1 # Attention !for q in range(1, m) :while k > 0 and P[k+1] != P[q] :k = pi[k]if P[k+1] == P[q] :k += 1pi[q] = kreturn pi#-------------for testing----------------------
#string_1 = "hello goodbye and hello"
#string_2 = "hello"
string_1 = "abcabaabcabac"
string_2 = "abaa"
kmp_matcher(string_1, string_2)





PHP神人吐槽KMP




waiting for updates ... ...





这篇关于String Matching -- Brute Force + Rabin-Karp + KMP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035724

相关文章

1_CString char* string之间的关系

CString转char*,string string转char*,CString char* 转CString,string 一、CString转char*,string //字串转换测试 CString CString1; std::string string1; CHAR* char1=NULL; //1string1=CString1.GetBuffer();CStri

query string parameters 和request payload

HTTP请求中,如果是get请求,那么表单参数以name=value&name1=value1的形式附到url的后; post请求:表单参数是在请求体中,也是name=value&name1=value1的形式在请求。 export const voucherDetailAdd=(token,formStr) =>{return axios.post(`${base}/voucher/deta

【Java】ArrayListString转化为String数组问题

Java的容器类Collections中toArray()方法,可以把诸如ArrayList<String>的动态数组、不定长转化静态数组、定长数组String[] 但是,如下的转化方式是错误的。 [java]  view plain copy String[] strArray = (String[]) arrayList.toArray();   如果这样执行会导致

C++:字符串string类使用

C++字符串和C字符串的对比 (1)C语言严格说没有字符串的概念,C字符串其实就是字符数组或字符指针 (2)C++和之后的java等都有字符串,本质是一个class (3)C++字符串的优势是标准库自带可用于字符串的各种处理算法和方法 (4)C++实际开发中建议使用C++字符串而不是沿用C式字符串 字符串string类使用 std::string str = "Hello, Worl

Java中String和StringBuffer的区别?

String 不是简单类型,而是一个类,它被用来表示字符序列。字符本身符合 Unicode 标准,其初始化方式有两种。如:String greeting=“Good Morning! \n”;String greeting=new String(=“Good Morning! \n”);String的特点是一旦赋值,便不能更改其指向的字符对象,如果更改,则会指向一个新的字符对象 。StringB

C++系列-String(二)

🌈个人主页:羽晨同学  💫个人格言:“成为自己未来的主人~”   #define _CRT_SECURE_NO_WARNINGS#include<string>#include<iostream>#include<list>#include<algorithm>using namespace std;void test_string3(){string s1("hel

【Java反射】getDeclaredField(String name) 和 getField(String name)区别

getDeclaredField(String name) 和 getField(String name) 都是Java反射API中用于获取类字段(成员变量)的方法,但它们之间存在一些关键的区别: getDeclaredField(String name) 功能:这个方法返回的是声明在该类中的指定名称的字段,包括私有、受保护、默认(包访问权限)和公有字段,不论该字段是在哪个类中声明的。也就是说

C++primer 3 string

#include <iostream>#include <string>using namespace std;int main(){//统计标点符号的个数/*string s("!af,yu,jf!!!");string::size_type a=0;for(string::size_type i=0;i<=(s.size()-1);++i)if(ispunct(s[i]))a=a+1;c

c.toString() 和 String s = new String(c) 区别

String str = "abcd";char [] c = str.toCharArray();String s = new String(c);String s2 = c.toString();其中s和s2有什么区别???String str = "abcd";char [] c = str.toCharArray();String s = new String(c); //

String的== 与equals详解

先来看一个面试题 结果是 false;true;false "=="来比较它们所引用的是否是同一个对象时 string 比较是否同一个对象,用== string比较字符串字面量相等用equals string 字面量创建的会写入到常量池,独立的 string new出来的会进堆,独立的 final的值在编译是就确定了 所以 此时 a+b 对编译器来说就是“ab” 没有fi