用于模式搜索的 Rabin-Karp 算法的Java程序
给定一个文本txt[0..n-1]和一个模式pat[0..m-1] ,编写一个函数search(char pat[], char txt[])打印txt中所有出现的pat[] [] 。你可以假设 n > m。
例子:
输入:txt[] = "THIS IS A TEST TEXT" pat[] = "TEST" 输出:在索引 10 找到的模式 输入:txt[] = "AABAACAADAABAABA" pat[] = "AABA" 输出:在索引 0 找到的模式在索引 9 找到的模式 在索引 12 找到的模式
朴素字符串匹配算法会一张一张地滑动模式。每张幻灯片后,它会逐一检查当前班次的字符,如果所有字符都匹配,则打印匹配项。
与朴素算法一样,Rabin-Karp 算法也将图案一一滑动。但与 Naive 算法不同的是,Rabin Karp 算法将模式的哈希值与当前文本子串的哈希值匹配,如果哈希值匹配,则只有它开始匹配单个字符。所以 Rabin Karp 算法需要为后面的字符串计算哈希值。
1) 图案本身。
2) 长度为 m 的文本的所有子串。
Java
// Following program is a Java implementation
// of Rabin Karp Algorithm given in the CLRS book
public class Main {
// d is the number of characters in the input alphabet
public final static int d = 256;
/* pat -> pattern
txt -> text
q -> A prime number
*/
static void search(String pat, String txt, int q)
{
int M = pat.length();
int N = txt.length();
int i, j;
int p = 0; // hash value for pattern
int t = 0; // hash value for txt
int h = 1;
// The value of h would be "pow(d, M-1)%q"
for (i = 0; i < M - 1; i++)
h = (h * d) % q;
// Calculate the hash value of pattern and first
// window of text
for (i = 0; i < M; i++) {
p = (d * p + pat.charAt(i)) % q;
t = (d * t + txt.charAt(i)) % q;
}
// Slide the pattern over text one by one
for (i = 0; i <= N - M; i++) {
// Check the hash values of current window of text
// and pattern. If the hash values match then only
// check for characters on by one
if (p == t) {
/* Check for characters one by one */
for (j = 0; j < M; j++) {
if (txt.charAt(i + j) != pat.charAt(j))
break;
}
// if p == t and pat[0...M-1] = txt[i, i+1, ...i+M-1]
if (j == M)
System.out.println("Pattern found at index " + i);
}
// Calculate hash value for next window of text: Remove
// leading digit, add trailing digit
if (i < N - M) {
t = (d * (t - txt.charAt(i) * h) + txt.charAt(i + M)) % q;
// We might get negative value of t, converting it
// to positive
if (t < 0)
t = (t + q);
}
}
}
/* Driver program to test above function */
public static void main(String[] args)
{
String txt = "GEEKS FOR GEEKS";
String pat = "GEEK";
int q = 101; // A prime number
search(pat, txt, q);
}
}
// This code is contributed by nuclode
输出:
Pattern found at index 0
Pattern found at index 10
有关更多详细信息,请参阅有关模式搜索的 Rabin-Karp 算法的完整文章!
在评论中写代码?请使用 ide.geeksforgeeks.org,生成链接并在此处分享链接。