Given a binary string S of length N and an integer K, the task is to calculate the farthest position that can be reached starting from the first position in exactly K jumps.
A jump can be made from index i to j only if:
- i != j
- If the character at one of them is ‘0’ and another is ‘1’.
Examples:
Input: S = “100101”, K = 2
Output: 6
Explanation: Following steps can be taken: 1 -> 5 -> 6, Therefore 6th index can be reached in exactly 2 jumps
Input: S = “10111”, K = 1
Output: 2
Explanation: Following steps can be taken: 1 -> 2, Therefore 2nd index can be reached in exactly 2 jumps
Approach: The main observation of the problem is that the continuous patterns of 0s and 1s can be replaced with single 0 or single 1 because one cannot jump between similar characters. After replacing these continuous patterns of 0s and 1s, Now, one can simply check if the new pattern says str formed is less than equal to K then it is not possible to reach some point with K moves, otherwise, the position is simply the first position from the right in the actual pattern which contains the character str[K].
Follow the steps below to solve the problem:
- Iterate from start to end of the given string i = 0 to i = N-1 and generate new string str after replacing all continuous subpatterns of 0s with single 0 and of 1s with single 1.
- Now, check if the length of the newly formed string is less than equal to K then print -1
- Else if the length of the newly formed string is greater than K, then simply print the 1-based position of the character str[K] from the right.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to find the farthest point void get(string s, int k)
{ // Store the answer
int ans = 0;
// Find the new string str
string str = "" ;
str += s[0];
// Variables to count the zeroes and ones
int cnt1 = 0, cnt0 = 0;
int n = s.length();
// Boolean variable to keep track of the subpattern
bool isOne;
if (s[0] == '0' )
isOne = false ;
// Iterate over the string and remove the
// continuous patterns of 0s and 1s
for ( int i = 1; i < n; i++) {
if (s[i] == '0' && isOne) {
str += s[i];
isOne = !isOne;
}
else if (s[i] == '1' && !isOne) {
str += s[i];
isOne = !isOne;
}
}
// Count the number of zeroes and ones
for ( int i = 0; i < n; i++) {
if (str[i] == '0' )
cnt0++;
else
cnt1++;
}
// Check if the K jumps are not possible
if (str.length() <= k) {
cout << -1 << endl;
return ;
}
// If K jumps are possible
for ( int i = n - 1; i >= 0; i--) {
if (s[i] == str[k]) {
ans = i + 1;
break ;
}
}
cout << ans + 1 << endl;
} // Driver Code int main()
{ string s = "100101" ;
int k = 2;
get(s, k);
return 0;
} |
// Java program for the above approach import java.util.*;
public class GFG
{ // Function to find the farthest point static void get(String s, int k)
{ // Store the answer
int ans = 0 ;
// Find the new string str
String str = "" ;
str += s.charAt( 0 );
// Variables to count the zeroes and ones
int cnt1 = 0 , cnt0 = 0 ;
int n = s.length();
// Boolean variable to keep track of the subpattern
boolean isOne = false ;
if (s.charAt( 0 ) == '0' )
isOne = false ;
// Iterate over the string and remove the
// continuous patterns of 0s and 1s
for ( int i = 1 ; i < n; i++) {
if (s.charAt(i) == '0' && isOne) {
str += s.charAt(i);
isOne = !isOne;
}
else if (s.charAt(i) == '1' && !isOne) {
str += s.charAt(i);
isOne = !isOne;
}
}
// Count the number of zeroes and ones
for ( int i = 0 ; i < str.length(); i++) {
if (str.charAt(i) == '0' )
cnt0++;
else
cnt1++;
}
// Check if the K jumps are not possible
if (str.length() <= k) {
System.out.print(- 1 );
return ;
}
// If K jumps are possible
for ( int i = n - 1 ; i >= 0 ; i--) {
if (s.charAt(i) == str.charAt(k)) {
ans = i + 1 ;
break ;
}
}
System.out.print(ans + 1 );
} // Driver Code public static void main(String args[])
{ String s = "100101" ;
int k = 2 ;
get(s, k);
} } // This code is contributed by Samim Hossain Mondal |
# Python3 program for the above approach # Function to find the farthest point def get(s, k) :
# Store the answer
ans = 0 ;
# Find the new string str
string = "";
string + = s[ 0 ];
# Variables to count the zeroes and ones
cnt1 = 0 ; cnt0 = 0 ;
n = len (s);
# Boolean variable to keep track of the subpattern
isOne = False ;
if (s[ 0 ] = = '0' ) :
isOne = False ;
# Iterate over the string and remove the
# continuous patterns of 0s and 1s
for i in range ( 1 , n) :
if (s[i] = = '0' and isOne) :
string + = s[i];
isOne = not isOne;
elif (s[i] = = '1' and ( not isOne)) :
string + = s[i];
isOne = not isOne;
# Count the number of zeroes and ones
for i in range ( len (string)) :
if (string[i] = = '0' ) :
cnt0 + = 1 ;
else :
cnt1 + = 1 ;
# Check if the K jumps are not possible
if ( len (string) < = k) :
print ( - 1 ) ;
return ;
# If K jumps are possible
for i in range (n - 1 , - 1 , - 1 ) :
if (s[i] = = string[k]) :
ans = i + 1 ;
break ;
print (ans + 1 );
# Driver Code if __name__ = = "__main__" :
s = "100101" ;
k = 2 ;
get(s, k);
# This code is contributed by AnkThon
|
// C# program for the above approach using System;
class GFG
{ // Function to find the farthest point static void get ( string s, int k)
{ // Store the answer
int ans = 0;
// Find the new string str
string str = "" ;
str += s[0];
// Variables to count the zeroes and ones
int cnt1 = 0, cnt0 = 0;
int n = s.Length;
// Bool variable to keep track of the subpattern
bool isOne = false ;
if (s[0] == '0' )
isOne = false ;
// Iterate over the string and remove the
// continuous patterns of 0s and 1s
for ( int i = 1; i < n; i++) {
if (s[i] == '0' && isOne) {
str += s[i];
isOne = !isOne;
}
else if (s[i] == '1' && !isOne) {
str += s[i];
isOne = !isOne;
}
}
// Count the number of zeroes and ones
for ( int i = 0; i < str.Length; i++) {
if (str[i] == '0' )
cnt0++;
else
cnt1++;
}
// Check if the K jumps are not possible
if (str.Length <= k) {
Console.Write(-1);
return ;
}
// If K jumps are possible
for ( int i = n - 1; i >= 0; i--) {
if (s[i] == str[k]) {
ans = i + 1;
break ;
}
}
Console.Write(ans + 1);
} // Driver Code public static void Main()
{ string s = "100101" ;
int k = 2;
get (s, k);
} } // This code is contributed by Samim Hossain Mondal |
<script> // JavaScript Program to implement
// the above approach
// Function to find the farthest point
function get(s, k)
{
// Store the answer
let ans = 0;
// Find the new string str
let str = "" ;
str += s[0];
// Variables to count the zeroes and ones
let cnt1 = 0, cnt0 = 0;
let n = s.length;
// Boolean variable to keep track of the subpattern
let isOne;
if (s[0] == '0' )
isOne = false ;
// Iterate over the string and remove the
// continuous patterns of 0s and 1s
for (let i = 1; i < n; i++) {
if (s[i] == '0' && isOne) {
str += s[i];
isOne = !isOne;
}
else if (s[i] == '1' && !isOne) {
str += s[i];
isOne = !isOne;
}
}
// Count the number of zeroes and ones
for (let i = 0; i < n; i++) {
if (str[i] == '0' )
cnt0++;
else
cnt1++;
}
// Check if the K jumps are not possible
if (str.length <= k) {
document.write(-1 + '<br>' );
return ;
}
// If K jumps are possible
for (let i = n - 1; i >= 0; i--) {
if (s[i] == str[k]) {
ans = i + 1;
break ;
}
}
document.write(ans + 1 + '<br>' );
}
// Driver Code
let s = "100101" ;
let k = 2;
get(s, k);
// This code is contributed by Potta Lokesh
</script>
|
6
Time Complexity: O(N)
Auxiliary Space: O(N)