This approach utilizes dynamic programming to find the longest palindromic subsequence in the given string. The minimum number of insertions required is the difference between the length of the string and this subsequence. The idea is to consider characters from both ends of the string and make decisions accordingly using a DP table.
Time Complexity: O(n^2), where 'n' is the length of the string. This is due to the nested loops filling the DP table.
Space Complexity: O(n^2), as it uses a two-dimensional array for the DP table.
1#include <stdio.h>
2#include <string.h>
3
4int minInsertions(char *s) {
5 int n = strlen(s);
6 int dp[n][n];
7 memset(dp, 0, sizeof(dp));
8 for (int len = 1; len < n; len++) {
9 for (int i = 0, j = len; j < n; i++, j++) {
10 if (s[i] == s[j]) {
11 dp[i][j] = dp[i+1][j-1];
12 } else {
13 dp[i][j] = 1 + ((dp[i+1][j] < dp[i][j-1]) ? dp[i+1][j] : dp[i][j-1]);
14 }
15 }
16 }
17 return dp[0][n-1];
18}
19
20int main() {
21 char s[] = "mbadm";
22 printf("%d\n", minInsertions(s));
23 return 0;
24}
The function uses a 2D array dp
where dp[i][j]
represents the minimum insertions required to make the substring s[i...j]
a palindrome. We iterate over increasing lengths of substrings and decide whether to skip or keep certain characters based on whether they match.
This approach leverages a recursive function to explore all possibilities, but uses memoization to cache results of previously computed subproblems. This reduces redundant calculations.
Time Complexity: O(n^2)
Space Complexity: O(n^2) due to the memoization table.
1#include <stdio.h>
2#include <string.h>
3#define MAX 500
4
5int dp[MAX][MAX];
6
7int solve(char *s, int left, int right) {
8 if (left >= right)
9 return 0;
10 if (dp[left][right] != -1)
11 return dp[left][right];
12 if (s[left] == s[right])
13 dp[left][right] = solve(s, left + 1, right - 1);
14 else
15 dp[left][right] = 1 + (solve(s, left + 1, right) < solve(s, left, right - 1) ? solve(s, left + 1, right) : solve(s, left, right - 1));
16 return dp[left][right];
17}
18
19int minInsertions(char *s) {
20 memset(dp, -1, sizeof(dp));
21 return solve(s, 0, strlen(s) - 1);
22}
23
24int main() {
25 char s[] = "mbadm";
26 printf("%d\n", minInsertions(s));
27 return 0;
28}
This C solution uses a recursive function solve
which calculates the minimum insertions needed for a substring. It includes memoization to store intermediate results in a 2D array, avoiding redundant calculations.