GeeksforGeeks App
Open App
Browser
Continue

# 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 ``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

 ``

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

 ``

Output

`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.

My Personal Notes arrow_drop_up