Open In App

Convert all substrings of length 'k' from base 'b' to decimal

Last Updated : 14 Mar, 2023
Comments
Improve
Suggest changes
Like Article
Like
Report

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>

Output
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>

Output
17 25 23 

Time Complexity: O(n)
Auxiliary Space: O(n)

 


Next Article

Similar Reads