Maximum segment value after putting k breakpoints in a number
Given a large number as string s and an integer k which denotes the number of breakpoints we must put in the number k <= string length. The task is to find maximum segment value after putting exactly k breakpoints.
Examples:
Input : s = "8754", k = 2
Output : Maximum number = 87
Explanation : We need to two breakpoints. After
putting the breakpoints, we get following options
8 75 4
87 5 4
The maximum segment value is 87.
Input : s = "999", k = 1
Output : Maximum Segment Value = 99
Explanation : We need to one breakpoint. After
putting the breakpoint, we either get 99,9 or
9,99.
One important observation is, the maximum would always be of length “string-length – k” which is the maximum value of any segment. Considering the fact, problem becomes like sliding window problem means we need to find maximum of all substrings of size (string-length – k).
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int findMaxSegment(string &s, int k) {
int seg_len = s.length() - k;
int res = 0;
for ( int i=0; i<seg_len; i++)
res = res * 10 + (s[i] - '0' );
int seg_len_pow = pow (10, seg_len-1);
int curr_val = res;
for ( int i = 1; i <= (s.length() - seg_len); i++) {
curr_val = curr_val - (s[i-1]- '0' )*seg_len_pow;
curr_val = curr_val*10 + (s[i+seg_len-1]- '0' );
res = max(res, curr_val);
}
return res;
}
int main() {
string s = "8754" ;
int k = 2;
cout << "Maximum number = " << findMaxSegment(s, k);
return 0;
}
|
Java
class GFG {
static int findMaxSegment(String s, int k) {
int seg_len = s.length() - k;
int res = 0 ;
for ( int i = 0 ; i < seg_len; i++)
res = res * 10 + (s.charAt(i) - '0' );
int seg_len_pow = ( int )Math.pow( 10 ,
seg_len - 1 );
int curr_val = res;
for ( int i = 1 ;
i <= (s.length() - seg_len); i++) {
curr_val = curr_val -
(s.charAt(i - 1 ) - '0' ) * seg_len_pow;
curr_val = curr_val * 10 +
(s.charAt(i + seg_len - 1 ) - '0' );
res = Math.max(res, curr_val);
}
return res;
}
public static void main(String[] args) {
String s = "8754" ;
int k = 2 ;
System.out.print( "Maximum number = "
+ findMaxSegment(s, k));
}
}
|
Python3
def findMaxSegment(s, k):
seg_len = len (s) - k
res = 0
for i in range (seg_len):
res = res * 10 + ( ord (s[i]) - ord ( '0' ))
seg_len_pow = pow ( 10 , seg_len - 1 )
curr_val = res
for i in range ( 1 , len (s) - seg_len):
curr_val = curr_val - ( ord (s[i - 1 ]) -
ord ( '0' )) * seg_len_pow
curr_val = (curr_val * 10 +
( ord (s[i + seg_len - 1 ]) - ord ( '0' )))
res = max (res, curr_val)
return res
if __name__ = = '__main__' :
s = "8754"
k = 2
print ( "Maximum number = " ,
findMaxSegment(s, k))
|
C#
using System;
class GFG {
static int findMaxSegment( string s, int k) {
int seg_len = s.Length - k;
int res = 0;
for ( int i = 0; i < seg_len; i++)
res = res * 10 + (s[i] - '0' );
int seg_len_pow = ( int )Math.Pow(10,
seg_len - 1);
int curr_val = res;
for ( int i = 1;
i <= (s.Length- seg_len); i++) {
curr_val = curr_val -
(s[i - 1] - '0' ) * seg_len_pow;
curr_val = curr_val * 10 +
(s[i + seg_len - 1] - '0' );
res = Math.Max(res, curr_val);
}
return res;
}
public static void Main() {
String s = "8754" ;
int k = 2;
Console.WriteLine( "Maximum number = "
+ findMaxSegment(s, k));
}
}
|
Javascript
<script>
function findMaxSegment(s, k){
let seg_len = s.length - k
let res = 0
for (let i=0;i<seg_len;i++)
res = res * 10 + (s.charCodeAt(i) - '0' .charCodeAt(0))
let seg_len_pow = Math.pow(10, seg_len - 1)
let curr_val = res
for (let i = 1;i< s.length - seg_len;i++){
curr_val = curr_val - (s.charCodeAt(i - 1)- '0' .charCodeAt(0)) * seg_len_pow
curr_val = (curr_val * 10 +
(s.charCodeAt(i + seg_len - 1) - '0' .charCodeAt(0)))
res = Math.max(res, curr_val)
}
return res
}
let s = "8754"
let k = 2
document.writea( "Maximum number = " ,findMaxSegment(s, k))
</script>
|
Output
Maximum number = 87
Time complexity : O(K)
Auxiliary Space : O(1)
Last Updated :
19 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...