Skip to content

Commit 6eb2ea1

Browse files
committed
Day-56 Dynamic programming problems 2
1 parent 223ae23 commit 6eb2ea1

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
| :------------: | :----------: |
77
| Total Problems | 77 |
88
| Current Streak | 55 |
9-
| Longest Streak | 55 ( August 17, 2015 - October 10, 2015 ) |
9+
| Longest Streak | 55 ( August 17, 2015 - October 12, 2015 ) |
1010

1111
</center>
1212

string_problems/z.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include <iostream>
2+
#include <string>
3+
#include <vector>
4+
5+
6+
/**
7+
* Function to fill in zvalues vector of ztext
8+
*/
9+
std::vector<size_t> fillZvalues(const std::string & ztext) {
10+
size_t n = ztext.length();
11+
std::vector<size_t> zvals(n, 0);
12+
size_t L = 0, R = 0; // s[L..R] represent the prefix string.
13+
for (size_t i = 1; i < n; ++i) {
14+
if ( i > R ) {
15+
L = R = i;
16+
while( R < n && ztext[R-L] == ztext[R] ) {
17+
++R;
18+
}
19+
zvals[i] = R-L;
20+
--R;
21+
} else {
22+
size_t K = i - L;
23+
if( zvals[K] < R-i+1 ) {
24+
zvals[i] = zvals[K];
25+
} else {
26+
L = R = i;
27+
while( R < n && ztext[R-L] == ztext[R] ) {
28+
++R;
29+
}
30+
zvals[i] = R-L;
31+
--R;
32+
}
33+
}
34+
}
35+
return zvals;
36+
}
37+
38+
/**
39+
* This function returns index of text where pattern matches using z algorithm
40+
*/
41+
std::vector<size_t> search( const std::string & text, const std::string & pattern ) {
42+
std::string ztext = pattern + '$' + text;
43+
std::vector<size_t> zvalues = fillZvalues(ztext);
44+
std::vector<size_t> indices;
45+
for ( size_t i = 1; i < zvalues.size(); ++i ) {
46+
if (zvalues[i] == pattern.length()) {
47+
indices.push_back(i - pattern.length() -1 );
48+
}
49+
}
50+
return indices;
51+
}
52+
53+
int main()
54+
{
55+
std::string text, pattern;
56+
std::cout << "String searching using Z algorithm:\n";
57+
std::cout << "Enter text:";
58+
std::getline(std::cin, text);
59+
std::cout << "Pattern :";
60+
std::getline(std::cin, pattern);
61+
std::vector<size_t> indices = search(text, pattern);
62+
for (auto i : indices ) {
63+
std::cout << pattern << " occurs in given text starting at index " << i << std::endl;
64+
}
65+
return 0;
66+
}

0 commit comments

Comments
 (0)