Skip to content

Commit

Permalink
Merge pull request #1 from rajbodhak/rajbodhak-patch-1
Browse files Browse the repository at this point in the history
Implement Robin-Karp String Matching Algorithm in C++
  • Loading branch information
rajbodhak authored Oct 5, 2024
2 parents c45ca9f + 6c87da7 commit 6a92e64
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions robinKarpStringMatching.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#include <iostream>
#include <string>
#include <vector>

using namespace std;

#define d 256 // Number of characters in the input alphabet

// Function to implement Robin-Karp algorithm
void RobinKarp(string pat, string txt, int q) {
int M = pat.size();
int N = txt.size();
int i, j;
int p = 0; // hash value for pattern
int t = 0; // hash value for text
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[i]) % q;
t = (d * t + txt[i]) % q;
}

// Slide the pattern over text one by one
for (i = 0; i <= N - M; i++) {
// Check the hash values of the current window of text and pattern
// If the hash values match, then check characters one by one
if (p == t) {
bool flag = true;
for (j = 0; j < M; j++) {
if (txt[i + j] != pat[j]) {
flag = false;
break;
}
}

// If p == t and pat[0...M-1] == txt[i, i+1, ...i+M-1]
if (flag)
cout << "Pattern found at index " << i << endl;
}

// Calculate hash value for next window of text: Remove leading digit, add trailing digit
if (i < N - M) {
t = (d * (t - txt[i] * h) + txt[i + M]) % q;

// We might get negative values of t, convert it to positive
if (t < 0)
t = (t + q);
}
}
}

int main() {
string txt = "GEEKS FOR GEEKS";
string pat = "GEEK";
int q = 101; // A prime number to mod hash values

RobinKarp(pat, txt, q);

return 0;
}

0 comments on commit 6a92e64

Please sign in to comment.