Home >Backend Development >C++ >Find different palindromic substrings in a given string using dynamic programming
In this tutorial, we discussed a method to find all possible palindromic substrings using an input string. To implement the method for this task we use C programming language and its functions.
A palindrome is a string that reads the same from front to back and from back to front. For example, Mom is a palindrome string. In this tutorial, we will take a string and find all possible palindrome substrings in it.
The Chinese translation ofString = abcaa
The possible palindromic substrings are : a, b, c, aa, aaa, aba, and aca.
In the above example, the input string can generate 7 palindrome substrings: 'a', 'b', 'c', 'aa', 'aaa', 'aba' and 'aca'.
The Chinese translation ofString = “abcd”
a, b, c, and d.
In the above example, only 4 palindromic substrings of length 1 can be obtained using the input string. Since there are no repeated characters in the input string, no substring has a length greater than 1.
size() − This is a string-like function that returns the number of characters in a given string. It does not accept parameters.
string_name.size();
str.size();
begin() − This library function is defined in STL. It gives the starting iteration value of the map container.
end() − This library function is defined in STL. It gives the end iteration value of the map container.
map_name.end();
mp.end();
substr() − It generates a substring using the input string. It is defined in the string.h header file. It accepts two parameters (pos, len). Pos is the starting value of the substring and len is the number of characters in the substring.
string_name.substr(pos, len);
str.substr();
Consider a given string and find all palindrome substrings in it.
Find all palindromic substrings of the input string by iterating the string.
Create two arrays for odd and even length palindromic substrings.
Store the values of two arrays in a hash map.
Print all values stored in Hashmap.
The number of substrings is equal to the length of the hash map. Iterate through the hash map and print out each value. Use a for loop to access each item in the map and print its associated value. Finally, the number of values printed should match the size of the hash map.
In this section, we implement one of the above examples using concepts from the C programming language. We consider an input string in the main() function and use it to generate output.
#include <iostream> #include <map> using namespace std; //user defined program to find the palindrome substrings void palindromeSubStrings(string str){ map<string, int> mp; int l = str.size(); //store odd and even length palindrome substrings int R[2][l+1]; //Using guards for effortless iteration over the input string and generating all palindrome // substrings str = "@" + str + "#"; for (int i = 0; i <= 1; i++) { int r = 0; R[i][0] = 0; int x = 1; while (x <= l){ while (str[x - r - 1] == str[x + i + r]) r++; R[i][x] = r; int a = 1; while ((R[i][x - a] != r - a) && (a < r)){ R[i][x + a] = min(R[i][x - a],r - a); a++; } r = max(r - a,0); x += a; } } //storing the substring without guards str = str.substr(1, l); mp[string(1, str[0])]=1; for (int x = 1; x <= l; x++){ for (int y = 0; y <= 1; y++) for (int r = R[y][x]; r > 0; r--) mp[str.substr(x - r - 1, 2 * r + y)]=1; mp[string(1, str[x])]=1; } //print the palindrome substrings stored in the Hashmap cout << "Palindrome substrings are as listed: "; map<string, int>::iterator xx; for (xx = mp.begin(); xx!=mp.end(); ++xx) cout << (*xx).first << endl; } //Controlling code int main(){ //calling the user-defined function and passing a string as argument palindromeSubStrings("abcaa"); return 0; }
Palindrome substrings are listed as: a aa b c
We are implementing another example using dynamic programming methods. In dynamic programming, tasks are broken down into subtasks and solved individually to reduce time and complexity.
#include <iostream> #include <vector> using namespace std; //User defined function to find the palindromic substring int find(string str){ int a = str.size(); //defined dpg array vector<vector<bool> > dpg(a, vector<bool>(a, false)); for (int x = 0; x < a; x++) { dpg[x][x] = 1; if (x < a && str[x] == str[x + 1]) { dpg[x][x + 1] = 1; } } // Finding length of different substrings for (int l = 3; l <= a; l++) { for (int x = 0; x + l - 1 < a; x++){ if (str[x] == str[x + (l - 1)] && dpg[x + 1][x + (l - 1) - 1]) { dpg[x][x + (l - 1)] = true; } } } vector<int> kmp(a, 0); for (int x = 0; x < a; x++) { int y = 0, m = 1; while (m + x < a) { if (str[y + x] == str[m + x]){ dpg[m + x - y][m + x] = false; kmp[m++] = ++y; } else if (y > 0) { y = kmp[y - 1]; } else { kmp[m++] = 0; } } } int cnt = 0; for (int x = 0; x < a; x++) { string str1; for (int y = x; y < a; y++) { str1 += str[y]; if (dpg[x][y]) { //counting number of palindromic substrings formed using the string cnt++; cout << str1 << '\n'; } } } cout << "Total number of palindromes are " << cnt << '\n'; return 0; } //Controller int main(){ string str = "abaa"; find(str); return 0; }
a aba b aa Total number of palindromes are 4
In this tutorial, we developed two methods to find all possible palindromic substrings in a given string. We use two examples to understand the task and write a sample code using C programming language. We use hash maps and vectors to store palindromic substrings to implement the example. The use of hash map helps in matching key value pairs and we can use many hash functions as per our requirement. We also used some library functions to implement the examples.
The above is the detailed content of Find different palindromic substrings in a given string using dynamic programming. For more information, please follow other related articles on the PHP Chinese website!