Advanced String Manipulation
Mind Map Summary
- Topic: Advanced String Manipulation
- Core Concepts:
- Rabin-Karp Algorithm: A string searching algorithm that uses a rolling hash to find a pattern in a text.
- Longest Palindromic Substring: The longest substring of a given string that is a palindrome.
Practice Exercise
Implement the Rabin-Karp algorithm to find all occurrences of a pattern in a text. Find the longest palindromic substring in a given string.
Answer
1. Rabin-Karp Algorithm:
public List<int> RabinKarp(string text, string pattern) {
int n = text.Length;
int m = pattern.Length;
int prime = 101;
int d = 256;
int h = 1;
int p = 0;
int t = 0;
var res = new List<int>();
for (int i = 0; i < m - 1; i++) {
h = (h * d) % prime;
}
for (int i = 0; i < m; i++) {
p = (d * p + pattern[i]) % prime;
t = (d * t + text[i]) % prime;
}
for (int i = 0; i <= n - m; i++) {
if (p == t) {
int j;
for (j = 0; j < m; j++) {
if (text[i + j] != pattern[j]) break;
}
if (j == m) res.Add(i);
}
if (i < n - m) {
t = (d * (t - text[i] * h) + text[i + m]) % prime;
if (t < 0) t = (t + prime);
}
}
return res;
}
2. Longest Palindromic Substring:
public string LongestPalindrome(string s) {
if (string.IsNullOrEmpty(s)) return "";
int start = 0, end = 0;
for (int i = 0; i < s.Length; i++) {
int len1 = ExpandAroundCenter(s, i, i);
int len2 = ExpandAroundCenter(s, i, i + 1);
int len = Math.Max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.Substring(start, end - start + 1);
}
private int ExpandAroundCenter(string s, int left, int right) {
while (left >= 0 && right < s.Length && s[left] == s[right]) {
left--;
right++;
}
return right - left - 1;
}