Dada la string str , la tarea es repetir cada substring de la string X número de veces, donde X es el número compuesto por los dígitos consecutivos presentes justo después de la substring en la string original. Por ejemplo , si str = “g1e2ks1” , la string resultante será “geeks” . Ejemplos:
Entrada: str = “2a10bd3”
Salida: aaaaaaaaaabdbdbd
Explicación: El primer dígito “2” no es necesario ya que no hay una substring válida antes. “a” se repetirá 10 veces y luego “bd” se repetirá tres veces.Entrada: str = «g1ee1ks1for1g1e2ks1»
Salida: geeksforgeeks
Enfoque: busque la primera substring válida, es decir, la substring que no contiene ningún dígito, luego analice el número entero presente justo después de la substring encontrada usando parseInt() y luego repita la substring encontrada la cantidad de veces requerida. Repita estos pasos para todas las substrings válidas y luego imprima la string resultante. A continuación se muestra la implementación del enfoque anterior:
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>
geeksforgeeks