Skip to content
Related Articles
Open in App
Not now

Related Articles

Minimum moves to make String Palindrome incrementing all characters of Substrings

Improve Article
Save Article
  • Last Updated : 21 Dec, 2022
Improve Article
Save Article

Given a string S of length N, the task is to find the minimum number of moves required to make a string palindrome where in each move you can select any substring and increment all the characters of the substring by 1.

Examples:

Input: S = “264341”
Output: 2

Explanation: We can perform the following operations:
Select the substring  “4341”. The string will be  “265452” 
Select the substring “45”. The string will be “265562”.
Hence after performing 2 operation on string S we get palindrome.

Input: S = “121”
Output: 0

Approach: To solve the problem follow the below approach:

We want to make S a palindrome, so let’s look at corresponding pairs in S  i.e, pairs of indices (i, N-1−i). If S[i] ≤ S[N-i-1] then S[i] should be incremented to S[N-i-1]. For each index find out the minimum number moves required to make that character same to its counterpart in the palindrome. 

Now optimally choose a substring where minimum number of operations should be performed on that substring. This can be done greedily by checking for substring where the requirement for (i+1)th index is at least the same as ith index.

Follow the steps mentioned below to implement the idea: 

  • Create a new array B[] of length N to find the number of moves required for each character. So where B[i] = S[N-i-1] – S[i], if S[i] is at most S[N-i-1].Otherwise, B[i] = 0.
  • Iterate from i = 0 to N:
    • If i = 0, perform, perform B[0] operations on the first index.
    • For other indices:
      • If B[i] ≤ B[i-1], we can extend B[i]  of the operations performed on index (i-1) to also cover this index, for no extra cost.
      • If B[i-1] < B[i] extra operations should start at starting at index i.
      • The above two cases can be combined to say that we perform max(0, B[i] − B[i-1]) operations starting at index 1.
  • So, the final answer is simply [N i=2∑ max(0, B[i] − B[i−1])] 

Below is the implementation of the above approach.

C++

// C++ code to implement the approach
#include <iostream>
using namespace std; 

// Function to Find the minimum number of moves
// to make string palindrome
void minMoves(int a[], int n)
{
  int b[n]={0};
  for (int i = 0; i < n; i++) {
    if (a[i] > a[n - i - 1]) {
      b[i] = a[i] - a[n - i - 1];
    }
  }
  long ans = b[0];
  for (int i = 1; i < n; i++) {
    ans += max(0, b[i] - b[i - 1]);
  }
  cout<<(ans)<<endl;
}

// Driver Code
int main()
{
  // Testcase1
  string S1 = "2643";
  int N = S1.size();
  int A[N];
  for (int i = 0; i < N; i++) {
    A[i] = S1[i] - '0';
  }

  // Function Call
  minMoves(A, N);

  // Testcase2
  string S2 = "113678";
  N = S2.size();
  int B[N];
  for (int i = 0; i < N; i++) {
    B[i] = S2[i] - '0';
  }

  // Function Call
  minMoves(B, N);
}


// This code is contributed by Aman Kumar.

Java

// Java code to implement the approach

import java.io.*;
import java.util.*;

public class GFG {

    // Function to Find the minimum number of moves
    // to make string palindrome
    public static void minMoves(int a[], int n)
    {
        int b[] = new int[n];
        for (int i = 0; i < n; i++) {
            if (a[i] > a[n - i - 1]) {
                b[i] = a[i] - a[n - i - 1];
            }
        }
        long ans = b[0];
        for (int i = 1; i < n; i++) {
            ans += Math.max(0, b[i] - b[i - 1]);
        }
        System.out.println(ans);
    }

    // Driver Code
    public static void main(String[] args)
    {
        // Testcase1
        String S1 = "2643";
        int N = S1.length();
        int[] A = new int[N];
        for (int i = 0; i < N; i++) {
            A[i] = S1.charAt(i) - '0';
        }

        // Function Call
        minMoves(A, N);

        // Testcase2
        String S2 = "113678";
        N = S2.length();
        int[] B = new int[N];
        for (int i = 0; i < N; i++) {
            B[i] = S2.charAt(i) - '0';
        }

        // Function Call
        minMoves(B, N);
    }
}

Python3

# Python code to implement the approach

# Function to find the minimum number 
# of moves to make string palindrome
def minMoves(a, n):
    b = [0]*n
    for i in range(n):
        if(a[i] > a[n-i-1]):
            b[i] = a[i] - a[n-i-1]

    ans = b[0]
    for i in range(1, n):
        ans = ans + max(0, b[i] - b[i-1])
    print(ans)

# Test case 1
S1 = "2643"
N = len(S1)
A = [0]*N
for i in range(N):
    A[i] = int(S1[i]) - 0

# Function call
minMoves(A, N)

# Test case 2
S2 = "113678"
N = len(S2)
B = [0]*N
for i in range(N):
    B[i] = int(S2[i]) - 0

# Function call
minMoves(B, N)

# This code is contributed by lokesh.

C#

// C# code to implement the approach
using System;

class GFG {

    // Function to Find the minimum number of moves
    // to make string palindrome
    static void minMoves(int[] a, int n)
    {
        int[] b = new int[n];
        for (int i = 0; i < n; i++) {
            if (a[i] > a[n - i - 1]) {
                b[i] = a[i] - a[n - i - 1];
            }
        }
        long ans = b[0];
        for (int i = 1; i < n; i++) {
            ans += Math.Max(0, b[i] - b[i - 1]);
        }
        Console.WriteLine(ans);
    }

    // Driver Code
    public static void Main()
    {
        // Testcase1
        string S1 = "2643";
        int N = S1.Length;
        int[] A = new int[N];
        for (int i = 0; i < N; i++) {
            A[i] = S1[i] - '0';
        }

        // Function Call
        minMoves(A, N);

        // Testcase2
        string S2 = "113678";
        N = S2.Length;
        int[] B = new int[N];
        for (int i = 0; i < N; i++) {
            B[i] = S2[i] - '0';
        }

        // Function Call
        minMoves(B, N);
    }
}

// This code is contributed by Samim Hossain Mondal.

Javascript

    // Javascript code to implement the approach
    
    // Function to Find the minimum number of moves
    // to make string palindrome
    function minMoves(a, n)
    {
    let b=Array(n).fill(0);
    for (let i = 0; i < n; i++) {
        if (a[i] > a[n - i - 1]) {
        b[i] = a[i] - a[n - i - 1];
        }
    }
    let ans = b[0];
    for (let i = 1; i < n; i++) {
        ans += Math.max(0, b[i] - b[i - 1]);
    }
    console.log(ans+"<br>");
    }
    
    // Driver Code
    
    // Testcase1
    let S1 = "2643";
    let N = S1.length;
    let A=new Array(N);;
    for (let i = 0; i < N; i++) {
        A[i] = S1[i] - '0';
    }
    
    // Function Call
    minMoves(A, N);
    
    // Testcase2
    let S2 = "113678";
    N = S2.length;
    let B=new Array(N);;
    for (let i = 0; i < N; i++) {
        B[i] = S2[i] - '0';
    }
    
    // Function Call
    minMoves(B, N);
    
    // This code is contributed by Pushpesh Raj
    
Output

3
7

Time Complexity: O(N)
Auxiliary Space: O(N)

Related Articles:

My Personal Notes arrow_drop_up
Related Articles

Start Your Coding Journey Now!