Convert all substrings of length ‘k’ from base ‘b’ to decimal
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:
C++
// 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; } |
Java
// 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 |
Python3
# 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 |
C#
// 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 */ |
Javascript
<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 :
C++
// 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; } |
Java
// 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 |
Python3
# 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 |
C#
// 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 |
Javascript
<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)
This article is contributed by Aarti_Rathi and Rohit Thapliyal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Login to comment...