Form the largest palindromic number using atmost two swaps
Given a non-negative palindromic number num containing n number of digits. The problem is to apply at most two swap operations on the number num so that the resultant is the largest possible palindromic number.
Examples:
Input : 4697557964
Output : 9647557469
In, 4697557964 the highlighted digits were
swapped to get the largest palindromic number
9647557469.
Input : 54345
Output : 54345
No swapping of digits required.
Approach: If n < 3, then num itself is the largest possible palindromic number. Else calculate mid = (n / 2) – 1. Then create an array rightMax[] of size (mid + 1). rightMax[i] contains the index of the greatest digit which is on the right side of num[i] and also greater than num[i] and 0 <= i <= mid. If no such digit exists then rightMax[i] = -1.
Now, traverse the rightMax[] array from i = 0 to m, and find the first element having rightMax[i] != -1. Perform the swap(num[i], num[rightMax[i]]) and swap(num[n – i – 1], num[n – rightMax[i] – 1]) operations and break.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void largestPalin( char num[], int n)
{
if (n <= 3)
return ;
int mid = n / 2 - 1;
int rightMax[mid + 1], right;
rightMax[mid] = -1;
right = mid;
for ( int i = mid - 1; i >= 0; i--) {
if (num[i] < num[right])
rightMax[i] = right;
else {
rightMax[i] = -1;
right = i;
}
}
for ( int i = 0; i <= mid; i++) {
if (rightMax[i] != -1) {
swap(num[i], num[rightMax[i]]);
swap(num[n - i - 1], num[n - rightMax[i] - 1]);
break ;
}
}
}
int main()
{
char num[] = "4697557964" ;
int n = strlen (num);
largestPalin(num, n);
cout << "Largest Palindrome: "
<< num;
return 0;
}
|
Java
import java.io.*;
public class GFG
{
static void largestPalin( char num[], int n)
{
if (n <= 3 )
return ;
int mid = n / 2 - 1 ;
int []rightMax = new int [mid + 1 ]; int right;
rightMax[mid] = - 1 ;
right = mid;
for ( int i = mid - 1 ; i >= 0 ; i--)
{
if (num[i] < num[right])
rightMax[i] = right;
else
{
rightMax[i] = - 1 ;
right = i;
}
}
for ( int i = 0 ; i <= mid; i++)
{
if (rightMax[i] != - 1 )
{
swap(num,i, rightMax[i]);
swap(num,n - i - 1 , n - rightMax[i] - 1 );
break ;
}
}
}
static char [] swap( char []arr, int i, int j)
{
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
public static void main(String[] args)
{
char num[] = "4697557964" .toCharArray();
int n = num.length;
largestPalin(num, n);
System.out.println( "Largest Palindrome: "
+ String.valueOf(num));
}
}
|
Python 3
def largestPalin(num, n):
if n < = 3 :
return
mid = n / / 2 + 1
rightMax = [ 0 ] * (mid + 1 )
rightMax[mid] = - 1
right = mid
for i in range (mid - 1 , - 1 , - 1 ):
if num[i] < num[right]:
rightMax[i] = right
else :
rightMax[i] = - 1
right = i
for i in range (mid + 1 ):
if rightMax[i] ! = - 1 :
num[i], num[rightMax[i]] = num[rightMax[i]], num[i]
num[n - i - 1 ], num[n - rightMax[i] - 1 ] = num[n - rightMax[i] - 1 ], num[n - i - 1 ]
break
if __name__ = = "__main__" :
num = "4697557964"
n = len (num)
num = list (num)
largestPalin(num, n)
num = ''.join(num)
print ( "Largest Palindrome: " ,num)
|
C#
using System;
class GFG
{
static void largestPalin( char []num, int n)
{
if (n <= 3)
return ;
int mid = n / 2 - 1;
int []rightMax = new int [mid + 1]; int right;
rightMax[mid] = -1;
right = mid;
for ( int i = mid - 1; i >= 0; i--)
{
if (num[i] < num[right])
rightMax[i] = right;
else
{
rightMax[i] = -1;
right = i;
}
}
for ( int i = 0; i <= mid; i++)
{
if (rightMax[i] != -1)
{
swap(num, i, rightMax[i]);
swap(num, n - i - 1, n - rightMax[i] - 1);
break ;
}
}
}
static char [] swap( char []arr, int i, int j)
{
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
public static void Main(String[] args)
{
char []num = "4697557964" .ToCharArray();
int n = num.Length;
largestPalin(num, n);
Console.WriteLine( "Largest Palindrome: " +
String.Join( "" , num));
}
}
|
Javascript
<script>
function largestPalin(num,n)
{
if (n <= 3)
return ;
let mid = Math.floor(n / 2) - 1;
let rightMax = new Array(mid + 1);
let right;
rightMax[mid] = -1;
right = mid;
for (let i = mid - 1; i >= 0; i--)
{
if (num[i] < num[right])
rightMax[i] = right;
else
{
rightMax[i] = -1;
right = i;
}
}
for (let i = 0; i <= mid; i++)
{
if (rightMax[i] != -1)
{
swap(num,i, rightMax[i]);
swap(num,n - i - 1, n - rightMax[i] - 1);
break ;
}
}
}
function swap(arr,i,j)
{
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
let num = "4697557964" .split( "" );
let n = num.length;
largestPalin(num, n);
document.write( "Largest Palindrome: "
+ (num).join( "" ));
</script>
|
Output
Largest Palindrome: 9647557469
Time Complexity: O(n).
Auxiliary Space: O(n).
Last Updated :
15 Dec, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...