Convert all substrings of length ‘k’ from base ‘b’ to decimal
Last Updated :
14 Mar, 2023
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++
#include <bits/stdc++.h>
using namespace std;
int substringConversions(string str, int k, int b)
{
for ( int i=0; i + k <= str.size(); i++)
{
string sub = str.substr(i, k);
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 << " " ;
}
}
int main()
{
string str = "12212" ;
int b = 3, k = 3;
substringConversions(str, b, k);
return 0;
}
|
Java
class GFG
{
static void substringConversions(String str, int k, int b)
{
for ( int i= 0 ; i + k <= str.length(); i++)
{
String sub = str.substring(i, i+k);
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 + " " );
}
}
public static void main(String[] args)
{
String str = "12212" ;
int b = 3 , k = 3 ;
substringConversions(str, b, k);
}
}
|
Python3
import math
def substringConversions(s, k, b):
l = len (s);
for i in range (l):
if ((i + k) < l + 1 ):
sub = s[i : i + k];
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 = " " );
s = "12212" ;
b, k = 3 , 3 ;
substringConversions(s, b, k);
|
C#
using System;
class GFG
{
static void substringConversions(String str, int k, int b)
{
for ( int i = 0; i + k <= str.Length; i++)
{
String sub = str.Substring(i, k);
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 + " " );
}
}
public static void Main(String[] args)
{
String str = "12212" ;
int b = 3, k = 3;
substringConversions(str, b, k);
}
}
|
Javascript
<script>
function substringConversions(str, k, b)
{
for (let i = 0; i + k <= str.length; i++)
{
let sub = str.substring(i, i+k);
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 + " " );
}
}
let str = "12212" ;
let b = 3, k = 3;
substringConversions(str, b, k);
</script>
|
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++
#include <bits/stdc++.h>
using namespace std;
int substringConversions(string str, int k, int b)
{
int i = 0, sum = 0, counter = k-1;
for (i; i < k; i++)
{
sum = sum + ((str.at(i) - '0' ) * pow (b, counter));
counter--;
}
cout << sum << " " ;
int prev = sum;
sum = 0, counter = 0;
for (i; i < str.size(); i++)
{
sum = prev - ((str.at(i - k) - '0' ) * pow (b, k-1));
sum = sum * b;
sum = sum + (str.at(i) - '0' );
cout << sum << " " ;
prev = sum;
counter++;
}
}
int main()
{
string str = "12212" ;
int b = 3, k = 3;
substringConversions(str, b, k);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void substringConversions(String str,
int k, int b)
{
int i = 0 , sum = 0 , counter = k- 1 ;
for (i = 0 ; i < k; i++)
{
sum = ( int ) (sum + ((str.charAt(i) - '0' ) *
Math.pow(b, counter)));
counter--;
}
System.out.print(sum + " " );
int prev = sum;
sum = 0 ; counter = 0 ;
for (; i < str.length(); i++)
{
sum = ( int ) (prev - ((str.charAt(i - k) - '0' ) *
Math.pow(b, k - 1 )));
sum = sum * b;
sum = sum + (str.charAt(i) - '0' );
System.out.print(sum + " " );
prev = sum;
counter++;
}
}
public static void main(String[] args)
{
String str = "12212" ;
int b = 3 , k = 3 ;
substringConversions(str, b, k);
}
}
|
Python3
import math as mt
def substringConversions(str1, k, b):
for i in range ( 0 , len (str1) - k + 1 ):
sub = str1[i:k + i]
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 = " " )
str1 = "12212"
b = 3
k = 3
substringConversions(str1, b, k)
|
C#
using System;
class GFG
{
static void substringConversions(String str,
int k, int b)
{
int i = 0, sum = 0, counter = k-1;
for (i = 0; i < k; i++)
{
sum = ( int ) (sum + ((str[i] - '0' ) *
Math.Pow(b, counter)));
counter--;
}
Console.Write(sum + " " );
int prev = sum;
sum = 0; counter = 0;
for (; i < str.Length; i++)
{
sum = ( int ) (prev - ((str[i - k] - '0' ) *
Math.Pow(b, k - 1)));
sum = sum * b;
sum = sum + (str[i] - '0' );
Console.Write(sum + " " );
prev = sum;
counter++;
}
}
public static void Main(String[] args)
{
String str = "12212" ;
int b = 3, k = 3;
substringConversions(str, b, k);
}
}
|
Javascript
<script>
function substringConversions(str, k, b)
{
let i = 0, sum = 0, counter = k-1;
for (i = 0; i < k; i++)
{
sum = (sum + ((str[i].charCodeAt(0) -
'0' .charCodeAt(0)) *
Math.pow(b, counter)));
counter--;
}
document.write(sum + " " );
let prev = sum;
sum = 0; counter = 0;
for (; i < str.length; i++)
{
sum = (prev - ((str[i - k].charCodeAt(0) -
'0' .charCodeAt(0)) *
Math.pow(b, k - 1)));
sum = sum * b;
sum = sum + (str[i].charCodeAt(0) -
'0' .charCodeAt(0));
document.write(sum + " " );
prev = sum;
counter++;
}
}
let str = "12212" ;
let b = 3, k = 3;
substringConversions(str, b, k);
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(n)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...