Open In App

Repeat substrings of the given String required number of times

Last Updated : 20 Apr, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Given string str, the task is to repeat every substring of the string X number of times where X is the number composed of the consecutive digits present just after the substring in the original string. For example, if str = “g1e2ks1” then the resultant string will be “geeks”. Examples:

Input: str = “2a10bd3”
Output: aaaaaaaaaabdbdbd
Explanation: First digit “2” is unnecessary as there is no valid substring before it. “a” will be repeated 10 times and then “bd” will be repeated thrice.

Input: str = “g1ee1ks1for1g1e2ks1”
Output: geeksforgeeks

Approach: Find the first valid substring i.e. the substring which doesn’t contain any digit then parse the integer present just after the found substring using parseInt() and then repeat the found substring the required number of times. Repeat these steps for all valid substrings and then print the resultant string. Below is the implementation of the above approach: 

C++




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function that returns true if the
// passed character is a digit
bool isDigit(char ch)
{
    if (ch >= '0' && ch <= '9')
        return true;
    return false;
}
 
// Function to return the next index
// of a non-digit character in the string
// starting at the index i (returns -1 if
// no such index is found)
int nextNonDigit(string str, int i)
{
    // If the character at index i is a digit
    // then skip to the next character
    while (i < str.length() && isDigit(str[i]))
    {
        i++;
    }
 
    // If no such index was found
    if (i >= str.length())
        return -1;
    return i;
}
 
// Function to append str the given number
// of times to the StringBuilder
void appendRepeated(string &sb, string str, int times)
{
    for (int i = 0; i < times; i++)
        sb.append(str);
}
 
// Function to return the string after
// performing the given operations
string findString(string str, int n)
{
    // To build the resultant string
    string sb = "";
 
    // Index of the first non-digit
    // character in the string
    int startStr = nextNonDigit(str, 0);
 
    // While there are substrings that
    // do not consist of digits
    while (startStr != -1)
    {
 
        // Find the ending of the substring
        int endStr = startStr;
        while ((endStr + 1) < n && !isDigit(str[endStr + 1]))
        {
            endStr++;
        }
 
        // Starting index of the number
        int startNum = endStr + 1;
 
        // If no digit appears after
        // the current substring
        if (startNum == -1)
            break;
 
        // Find the index at which the
        // current number ends
        int endNum = startNum;
        while ((endNum + 1) < n && isDigit(str[endNum + 1]))
        {
            endNum++;
        }
 
        // Parse the number from the substring
        int num = stoi(str.substr(startNum, endNum + 1));
 
        // Repeat the current substring required number of times
        appendRepeated(sb, str.substr(startStr, endStr + 1 - startStr), num);
 
        // Find the next non-digit character index
        startStr = nextNonDigit(str, endStr + 1);
    }
 
    // Return the resultant string
    return sb;
}
 
// Driver Code
int main()
{
    string str = "g1ee1ks1for1g1e2ks1";
    int n = str.length();
 
    cout << findString(str, n) << endl;
 
    return 0;
}
 
// This code is contributed by
// sanjeev2552


Java




// Java implementation of the approach
class GFG {
 
    // Function that returns true if the
    // passed character is a digit
    static boolean isDigit(char ch)
    {
        if (ch >= '0' && ch <= '9')
            return true;
        return false;
    }
 
    // Function to return the next index
    // of a non-digit character in the string
    // starting at the index i (returns -1 if
    // no such index is found)
    static int nextNonDigit(String str, int i)
    {
 
        // If the character at index i is a digit
        // then skip to the next character
        while (i < str.length()
               && isDigit(str.charAt(i))) {
            i++;
        }
 
        // If no such index was found
        if (i >= str.length())
            return -1;
        return i;
    }
 
    // Function to append str the given number
    // of times to the StringBuilder
    static void appendRepeated(StringBuilder sb,
                               String str, int times)
    {
        for (int i = 0; i < times; i++)
            sb.append(str);
    }
 
    // Function to return the string after
    // performing the given operations
    static String findString(String str, int n)
    {
 
        // To build the resultant string
        StringBuilder sb = new StringBuilder("");
 
        // Index of the first non-digit
        // character in the string
        int startStr = nextNonDigit(str, 0);
 
        // While there are substrings that
        // do not consist of digits
        while (startStr != -1) {
 
            // Find the ending of the substring
            int endStr = startStr;
            while ((endStr + 1) < n
                   && !isDigit(str.charAt(endStr + 1))) {
                endStr++;
            }
 
            // Starting index of the number
            int startNum = endStr + 1;
 
            // If no digit appears after
            // the current substring
            if (startNum == -1)
                break;
 
            // Find the index at which the
            // current number ends
            int endNum = startNum;
            while ((endNum + 1) < n
                   && isDigit(str.charAt(endNum + 1))) {
                endNum++;
            }
 
            // Parse the number from the substring
            int num = Integer.parseInt(str.substring(startNum,
                                                     endNum + 1));
 
            // Repeat the current substring required number of times
            appendRepeated(sb, str.substring(startStr,
                                             endStr + 1), num);
 
            // Find the next non-digit character index
            startStr = nextNonDigit(str, endStr + 1);
        }
 
        // Return the resultant string
        return sb.toString();
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "g1ee1ks1for1g1e2ks1";
        int n = str.length();
        System.out.println(findString(str, n));
    }
}


Python3




# Python3 implementation of the approach
 
# Function that returns true if the
# passed character is a digit
def isDigit(ch):
    if ch >= '0' and ch <= '9':
        return True
    return False
 
# Function to return the next index
# of a non-digit character in the string
# starting at the index i (returns -1 if
# no such index is found)
def nextNonDigit(string, i):
 
    # If the character at index i is a digit
    # then skip to the next character
    while i < len(string) and isDigit(string[i]):
        i += 1
 
    # If no such index was found
    if i >= len(string):
        return -1
    return i
 
# Function to append str the given number
# of times to the StringBuilder
def appendRepeated(sb, string, times):
    for i in range(times):
        sb.append(string)
 
# Function to return the string after
# performing the given operations
def findString(string, n):
 
    # To build the resultant string
    sb = list()
 
    # Index of the first non-digit
    # character in the string
    startStr = nextNonDigit(string, 0)
 
    # While there are substrings that
    # do not consist of digits
    while startStr != -1:
 
        # Find the ending of the substring
        endStr = startStr
 
        while (endStr + 1 < n and not
               isDigit(string[endStr + 1])):
            endStr += 1
 
        # Starting index of the number
        startNum = endStr + 1
 
        # If no digit appears
        # after the current substring
        if startNum == -1:
            break
 
        # Find the index at which the
        # current number ends
        endNum = startNum
 
        while (endNum + 1 < n and
               isDigit(string[endNum + 1])):
            endNum += 1
 
        # Parse the number from the substring
        num = int(string[startNum:endNum + 1])
 
        # Repeat the current substring
        # required number of times
        appendRepeated(sb, string[startStr:endStr + 1], num)
 
        # Find the next non-digit character index
        startStr = nextNonDigit(string, endStr + 1)
 
    # Return the resultant string
    sb = ''.join(sb)
    return sb
 
# Driver code
if __name__ == "__main__":
    string = "g1ee1ks1for1g1e2ks1"
    n = len(string)
    print(findString(string, n))
 
# This code is contributed by
# sanjeev2552


C#




// C# implementation of the approach
using System;
using System.Text;
 
class GFG{
 
// Function that returns true if the
// passed character is a digit
static bool isDigit(char ch)
{
    if (ch >= '0' && ch <= '9')
        return true;
         
    return false;
}
 
// Function to return the next index
// of a non-digit character in the string
// starting at the index i (returns -1 if
// no such index is found)
static int nextNonDigit(string str, int i)
{
 
    // If the character at index i is a digit
    // then skip to the next character
    while (i < str.Length && isDigit(str[i]))
    {
        i++;
    }
 
    // If no such index was found
    if (i >= str.Length)
        return -1;
         
    return i;
}
 
// Function to append str the given number
// of times to the StringBuilder
static void appendRepeated(StringBuilder sb,
                           string str, int times)
{
    for(int i = 0; i < times; i++)
        sb.Append(str);
}
 
// Function to return the string after
// performing the given operations
static String findString(string str, int n)
{
 
    // To build the resultant string
    StringBuilder sb = new StringBuilder("");
 
    // Index of the first non-digit
    // character in the string
    int startStr = nextNonDigit(str, 0);
 
    // While there are substrings that
    // do not consist of digits
    while (startStr != -1)
    {
 
        // Find the ending of the substring
        int endStr = startStr;
        while ((endStr + 1) < n &&
               !isDigit(str[endStr + 1]))
        {
            endStr++;
        }
 
        // Starting index of the number
        int startNum = endStr + 1;
 
        // If no digit appears after
        // the current substring
        if (startNum == -1)
            break;
 
        // Find the index at which the
        // current number ends
        int endNum = startNum;
        while ((endNum + 1) < n &&
                isDigit(str[endNum + 1]))
        {
            endNum++;
        }
 
        // Parse the number from the substring
        int num = Int32. Parse(str.Substring(
                  startNum, endNum - startNum + 1));
 
        // Repeat the current substring required
        // number of times
        appendRepeated(sb, str.Substring(
            startStr, endStr - startStr + 1), num);
 
        // Find the next non-digit character index
        startStr = nextNonDigit(str, endStr + 1);
    }
 
    // Return the resultant string
    return sb.ToString();
}
 
// Driver code
public static void Main(string[] args)
{
    string str = "g1ee1ks1for1g1e2ks1";
    int n = str.Length;
     
    Console.Write(findString(str, n));
}
}
 
// This code is contributed by rutvik_56


Javascript




<script>
// JavaScript implementation of the approach
 
// Function that returns true if the
// passed character is a digit
function isDigit(ch)
{
    if (ch.charCodeAt(0) >= '0'.charCodeAt(0) &&
    ch.charCodeAt(0) <= '9'.charCodeAt(0))
        return true;
    return false;
}
 
// Function to return the next index
// of a non-digit character in the string
// starting at the index i (returns -1 if
// no such index is found)
function nextNonDigit(string, i){
 
    // If the character at index i is a digit
    // then skip to the next character
    while(i < string.length && isDigit(string[i]))
        i += 1
 
    // If no such index was found
    if(i >= string.length)
        return -1
    return i
}
 
// Function to push str the given number
// of times to the StringBuilder
function appendRepeated(sb, string, times){
    for(let i=0;i<times;i++)
        sb.push(string)
}
// Function to return the string after
// performing the given operations
function findString(string, n){
 
    // To build the resultant string
    let sb = []
 
    // Index of the first non-digit
    // character in the string
    let startStr = nextNonDigit(string, 0)
 
    // While there are substrings that
    // do not consist of digits
    while(startStr != -1){
 
        // Find the ending of the substring
        let endStr = startStr
 
        while (endStr + 1 < n &&
               !isDigit(string[endStr + 1]))
            endStr += 1
 
        // Starting index of the number
        let startNum = endStr + 1
 
        // If no digit appears
        // after the current substring
        if(startNum == -1)
            break
 
        // Find the index at which the
        // current number ends
        let endNum = startNum
 
        while (endNum + 1 < n &&
               isDigit(string[endNum + 1]))
            endNum += 1
 
        // Parse the number from the substring
        let num = parseInt(string.substring(startNum,endNum + 1));
 
        // Repeat the current substring
        // required number of times
        appendRepeated(sb, string.substring(startStr,endStr + 1), num)
 
        // Find the next non-digit character index
        startStr = nextNonDigit(string, endStr + 1)
    }
    // Return the resultant string
    sb = sb.join('')
    return sb
}
 
// Driver Code
 
let str = "g1ee1ks1for1g1e2ks1";
let n = str.length;
 
document.write(findString(str, n));
 
// This code is contributed by shinjanpatra
 
</script>


Output:

geeksforgeeks

Time Complexity: O(n2) where n is the length of the string.
Auxiliary Space: O(n)



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads