A string defining a valid number is given. Output all the base conversions of substrings of length ‘k’ from base ‘b’ to base 10.
Examples:
Input : str = "12212", k = 3, b = 3. Output : 17 25 23 Explanation : All the substrings of length 'k' are : 122, 221, 212. Base conversion can be computed using the formula.
Naive approach: A simple approach is to use a simple base conversion technique. For a base b number str, its decimal equivalent is str[0]*b0 + str[1]*b1 + str[2]*b2 + … + str[n-1]*bn-1
Follow the below steps to implement the above idea:
- Define the substringConversions function that takes a string str, an integer k (substring length), and an integer b (target base) as input.
- For each substring of length k in str:
a. Extract the substring and save it in the variable sub.
b. Evaluate the decimal value of sub by iterating over each character in sub from right to left:
i. Convert the character to its corresponding digit value using sub.at(i) – ‘0’.
ii. Multiply the digit value by the base raised to the power of its position in the substring, starting from 0 (i.e., the rightmost digit has a power of 0).
iii. Add the result of step ii to a running total sum.
c. Print the final value of sum for the current substring. - End the substringConversions function.
Below is the implementation of the above approach:
// Simple C++ program to convert all substrings from // decimal to given base. #include <bits/stdc++.h> using namespace std;
int substringConversions(string str, int k, int b)
{ for ( int i=0; i + k <= str.size(); i++)
{
// Saving substring in sub
string sub = str.substr(i, k);
// Evaluating decimal for current substring
// and printing it.
int sum = 0, counter = 0;
for ( int i = sub.size() - 1; i >= 0; i--)
{
sum = sum + ((sub.at(i) - '0' ) * pow (b, counter));
counter++;
}
cout << sum << " " ;
}
} // Driver code int main()
{ string str = "12212" ;
int b = 3, k = 3;
substringConversions(str, b, k);
return 0;
} |
// Simple Java program to convert all substrings from // decimal to given base. class GFG
{ static void substringConversions(String str, int k, int b)
{ for ( int i= 0 ; i + k <= str.length(); i++)
{
// Saving substring in sub
String sub = str.substring(i, i+k);
// Evaluating decimal for current substring
// and printing it.
int sum = 0 , counter = 0 ;
for ( int j = sub.length() - 1 ; j >= 0 ; j--)
{
sum = ( int ) (sum + ((sub.charAt(j) - '0' ) *
Math.pow(b, counter)));
counter++;
}
System.out.print(sum + " " );
}
} // Driver code public static void main(String[] args)
{ String str = "12212" ;
int b = 3 , k = 3 ;
substringConversions(str, b, k);
} } // This code is contributed by 29AjayKumar |
# Simple Python3 program to convert # all substrings from decimal to given base. import math
def substringConversions(s, k, b):
l = len (s);
for i in range (l):
if ((i + k) < l + 1 ):
# Saving substring in sub
sub = s[i : i + k];
# Evaluating decimal for current
# substring and printing it.
sum , counter = 0 , 0 ;
for i in range ( len (sub) - 1 , - 1 , - 1 ):
sum = sum + (( ord (sub[i]) - ord ( '0' )) * pow (b, counter));
counter + = 1 ;
print ( sum , end = " " );
# Driver code s = "12212" ;
b, k = 3 , 3 ;
substringConversions(s, b, k); # This code is contributed # by Princi Singh |
// Simple C# program to convert all substrings from // decimal to given base. using System;
class GFG
{ static void substringConversions(String str, int k, int b)
{ for ( int i = 0; i + k <= str.Length; i++)
{
// Saving substring in sub
String sub = str.Substring(i, k);
// Evaluating decimal for current substring
// and printing it.
int sum = 0, counter = 0;
for ( int j = sub.Length - 1; j >= 0; j--)
{
sum = ( int ) (sum + ((sub[j] - '0' ) *
Math.Pow(b, counter)));
counter++;
}
Console.Write(sum + " " );
}
} // Driver code public static void Main(String[] args)
{ String str = "12212" ;
int b = 3, k = 3;
substringConversions(str, b, k);
} } /* This code is contributed by PrinciRaj1992 */ |
<script> // Simple Javascript program to convert // all substrings from decimal to given base. function substringConversions(str, k, b)
{ for (let i = 0; i + k <= str.length; i++)
{
// Saving substring in sub
let sub = str.substring(i, i+k);
// Evaluating decimal for current substring
// and printing it.
let sum = 0, counter = 0;
for (let j = sub.length - 1; j >= 0; j--)
{
sum = (sum + ((sub[j].charCodeAt(0) -
'0' .charCodeAt(0)) *
Math.pow(b, counter)));
counter++;
}
document.write(sum + " " );
}
} // Driver code let str = "12212" ;
let b = 3, k = 3; substringConversions(str, b, k); // This code is contributed by patel2127 </script> |
17 25 23
Time Complexity : O(n*k)
Auxiliary Space: O(n)
Efficient approach (Using sliding window): We can use Sliding Window technique to solve it in linear time. Every time we slide the window, we will subtract the weight of first element i.e. (element * pow(b, k-1) ). Now multiplying the previous sum with ‘b’ will increase weight of every element 3 times which is required. Also we will simply add the new element in window because its weight will be element * pow(b, 0).
Below is the implementation :
// Efficient C++ program to convert all substrings from // decimal to given base. #include <bits/stdc++.h> using namespace std;
int substringConversions(string str, int k, int b)
{ int i = 0, sum = 0, counter = k-1;
// Computing the decimal of first window
for (i; i < k; i++)
{
sum = sum + ((str.at(i) - '0' ) * pow (b, counter));
counter--;
}
cout << sum << " " ;
// prev stores the previous decimal
int prev = sum;
// Computing decimal equivalents of all other windows
sum = 0, counter = 0;
for (i; i < str.size(); i++)
{
// Subtracting weight of the element pushed out of window
sum = prev - ((str.at(i - k) - '0' ) * pow (b, k-1));
// Multiplying the decimal by base to formulate other window
sum = sum * b;
// Adding the new element of window to sum
sum = sum + (str.at(i) - '0' );
// Decimal of current window
cout << sum << " " ;
// Updating prev
prev = sum;
counter++;
}
} // Driver code int main()
{ string str = "12212" ;
int b = 3, k = 3;
substringConversions(str, b, k);
return 0;
} |
// Efficient Java program to convert // all substrings from decimal to given base. import java.util.*;
class GFG
{ static void substringConversions(String str,
int k, int b)
{ int i = 0 , sum = 0 , counter = k- 1 ;
// Computing the decimal of first window
for (i = 0 ; i < k; i++)
{
sum = ( int ) (sum + ((str.charAt(i) - '0' ) *
Math.pow(b, counter)));
counter--;
}
System.out.print(sum + " " );
// prev stores the previous decimal
int prev = sum;
// Computing decimal equivalents of all other windows
sum = 0 ; counter = 0 ;
for (; i < str.length(); i++)
{
// Subtracting weight of the element
// pushed out of window
sum = ( int ) (prev - ((str.charAt(i - k) - '0' ) *
Math.pow(b, k - 1 )));
// Multiplying the decimal by base
// to formulate other window
sum = sum * b;
// Adding the new element of window to sum
sum = sum + (str.charAt(i) - '0' );
// Decimal of current window
System.out.print(sum + " " );
// Updating prev
prev = sum;
counter++;
}
} // Driver code public static void main(String[] args)
{ String str = "12212" ;
int b = 3 , k = 3 ;
substringConversions(str, b, k);
} } // This code is contributed by Rajput-Ji |
# Simple Python3 program to convert all # substrings from decimal to given base. import math as mt
def substringConversions(str1, k, b):
for i in range ( 0 , len (str1) - k + 1 ):
# Saving substring in sub
sub = str1[i:k + i]
# Evaluating decimal for current
# substring and printing it.
Sum = 0
counter = 0
for i in range ( len (sub) - 1 , - 1 , - 1 ):
Sum = ( Sum + (( ord (sub[i]) - ord ( '0' )) *
pow (b, counter)))
counter + = 1
print ( Sum , end = " " )
# Driver code str1 = "12212"
b = 3
k = 3
substringConversions(str1, b, k) # This code is contributed by # Mohit Kumar 29 |
// Efficient C# program to convert // all substrings from decimal to given base. using System;
class GFG
{ static void substringConversions(String str,
int k, int b)
{ int i = 0, sum = 0, counter = k-1;
// Computing the decimal of first window
for (i = 0; i < k; i++)
{
sum = ( int ) (sum + ((str[i] - '0' ) *
Math.Pow(b, counter)));
counter--;
}
Console.Write(sum + " " );
// prev stores the previous decimal
int prev = sum;
// Computing decimal equivalents
// of all other windows
sum = 0; counter = 0;
for (; i < str.Length; i++)
{
// Subtracting weight of the element
// pushed out of window
sum = ( int ) (prev - ((str[i - k] - '0' ) *
Math.Pow(b, k - 1)));
// Multiplying the decimal by base
// to formulate other window
sum = sum * b;
// Adding the new element of window to sum
sum = sum + (str[i] - '0' );
// Decimal of current window
Console.Write(sum + " " );
// Updating prev
prev = sum;
counter++;
}
} // Driver code public static void Main(String[] args)
{ String str = "12212" ;
int b = 3, k = 3;
substringConversions(str, b, k);
} } // This code is contributed by Princi Singh |
<script> // Efficient Javascript program to convert // all substrings from decimal to given base. function substringConversions(str, k, b)
{ let i = 0, sum = 0, counter = k-1;
// Computing the decimal of first window
for (i = 0; i < k; i++)
{
sum = (sum + ((str[i].charCodeAt(0) -
'0' .charCodeAt(0)) *
Math.pow(b, counter)));
counter--;
}
document.write(sum + " " );
// prev stores the previous decimal
let prev = sum;
// Computing decimal equivalents of
// all other windows
sum = 0; counter = 0;
for (; i < str.length; i++)
{
// Subtracting weight of the element
// pushed out of window
sum = (prev - ((str[i - k].charCodeAt(0) -
'0' .charCodeAt(0)) *
Math.pow(b, k - 1)));
// Multiplying the decimal by base
// to formulate other window
sum = sum * b;
// Adding the new element of window to sum
sum = sum + (str[i].charCodeAt(0) -
'0' .charCodeAt(0));
// Decimal of current window
document.write(sum + " " );
// Updating prev
prev = sum;
counter++;
}
} // Driver code let str = "12212" ;
let b = 3, k = 3; substringConversions(str, b, k); // This code is contributed by unknown2108 </script> |
17 25 23
Time Complexity: O(n)
Auxiliary Space: O(n)