Given many N digits. We are also given 10 numbers which represents the alternate number for all the one-digit numbers from 0 to 9. We can replace any digit in N with the given alternate digit to it, but we are only allowed to replace any consecutive segment of numbers for once only, the task is to replace any consecutive segment of numbers such that the obtained number is the largest of all possible replacements.
Examples:
Input: n = 1337, a[] = {0, 1, 2, 5, 4, 6, 6, 3, 1, 9}
Output: 1557
1 can be replaced with 1 as a[1] = 1 (No effect)
3 can be replaced with 5
7 can be replaced with 3 (isn’t required if the number needs to be maximized)
Input: number = 11111, a[] = {0, 5, 2, 5, 4, 6, 6, 3, 1, 9}
Output: 55555
Approach: Since we need to get the largest number possible, hence iterate from the left and find the number whose alternate number is greater than the current one, and keep replacing the upcoming numbers till the alternate number is not smaller.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function to return the maximized number string get_maximum(string s, int a[]) { int n = s.size(); // Iterate till the end of the string for ( int i = 0; i < n; i++) { // Check if it is greater or not if (s[i] - '0' < a[s[i] - '0' ]) { int j = i; // Replace with the alternate till smaller while (j < n && (s[j] - '0' <= a[s[j] - '0' ])) { s[j] = '0' + a[s[j] - '0' ]; j++; } return s; } } // Return original s in case // no change took place return s; } // Driver Code int main() { string s = "1337" ; int a[] = { 0, 1, 2, 5, 4, 6, 6, 3, 1, 9 }; cout << get_maximum(s, a); return 0; } |
Java
// Java implementation of the approach import java.io.*; class GFG { // Function to return the maximized number static String get_maximum( char [] s, int a[]) { int n = s.length; // Iterate till the end of the string for ( int i = 0 ; i < n; i++) { // Check if it is greater or not if (s[i] - '0' < a[s[i] - '0' ]) { int j = i; // Replace with the alternate till smaller while (j < n && (s[j] - '0' <= a[s[j] - '0' ])) { s[j] = ( char ) ( '0' + a[s[j] - '0' ]); j++; } return String.valueOf(s); } } // Return original s in case // no change took place return String.valueOf(s); } // Driver Code public static void main(String[] args) { String s = "1337" ; int a[] = { 0 , 1 , 2 , 5 , 4 , 6 , 6 , 3 , 1 , 9 }; System.out.println(get_maximum(s.toCharArray(), a)); } } /* This code contributed by PrinciRaj1992 */ |
Python3
# Python3 implementation of the approach # Function to return the maximized number def get_maximum(s, a) : s = list (s) n = len (s) # Iterate till the end of the string for i in range (n) : # Check if it is greater or not if ( ord (s[i]) - ord ( '0' ) < a[ ord (s[i]) - ord ( '0' )]) : j = i # Replace with the alternate till smaller while (j < n and ( ord (s[j]) - ord ( '0' ) < = a[ ord (s[j]) - ord ( '0' )])) : s[j] = chr ( ord ( '0' ) + a[ ord (s[j]) - ord ( '0' )]) j + = 1 return "".join(s); # Return original s in case # no change took place return s # Driver Code if __name__ = = "__main__" : s = "1337" a = [ 0 , 1 , 2 , 5 , 4 , 6 , 6 , 3 , 1 , 9 ] print (get_maximum(s, a)) # This code is contributed by AnkitRai01 |
C#
// C# implementation of the approach using System; class GFG { // Function to return the maximized number static String get_maximum( char [] s, int [] a) { int n = s.Length; // Iterate till the end of the string for ( int i = 0; i < n; i++) { // Check if it is greater or not if (s[i] - '0' < a[s[i] - '0' ]) { int j = i; // Replace with the alternate till smaller while (j < n && (s[j] - '0' <= a[s[j] - '0' ])) { s[j] = ( char ) ( '0' + a[s[j] - '0' ]); j++; } return String.Join( "" ,s); } } // Return original s in case // no change took place return String.Join( "" ,s); } // Driver Code public static void Main(String[] args) { String s = "1337" ; int [] a = { 0, 1, 2, 5, 4, 6, 6, 3, 1, 9 }; Console.WriteLine(get_maximum(s.ToCharArray(), a)); } } // This code contributed by Rajput-Ji |
PHP
<?php // PHP implementation of the approach // Function to return the maximized number function get_maximum( $s , $a ) { $n = strlen ( $s ); // Iterate till the end of the string for ( $i = 0; $i < $n ; $i ++) { // Check if it is greater or not if ( $s [ $i ] - '0' < $a [ $s [ $i ] - '0' ]) { $j = $i ; // Replace with the alternate till smaller while ( $j < $n && ( $s [ $j ] - '0' <= $a [ $s [ $j ] - '0' ])) { $s [ $j ] = '0' + $a [ $s [ $j ] - '0' ]; $j ++; } return $s ; } } // Return original s in case // no change took place return $s ; } // Driver Code $s = "1337" ; $a = array ( 0, 1, 2, 5, 4, 6, 6, 3, 1, 9 ); echo get_maximum( $s , $a ); // This Code is contributed is Tushill. ?> |
Javascript
function getMaximum(s, a) { let n = s.length; // Store the length of the string // Iterate through the string for (let i = 0; i < n; i++) { // Check if the current digit is less than the alternate digit if (parseInt(s[i]) < a[parseInt(s[i])]) { let j = i; // Replace with alternate digit as long as it is less than or equal to the alternate digit while (j < n && (parseInt(s[j]) <= a[parseInt(s[j])])) { s = s.slice(0, j) + a[parseInt(s[j])] + s.slice(j + 1); // Replace the digit with alternate digit j++; } return s; // Return the maximized string } } return s; // Return the original string if no change took place } console.log(getMaximum( "1337" , [0, 1, 2, 5, 4, 6, 6, 3, 1, 9])); // logs "5567" //code by Satyam Nayak |
1557
Time Complexity: O(n2)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!