重复给定字符串的子字符串所需的次数
给定一个字符串str ,任务是重复字符串X的每个子字符串的次数,其中X是由原始字符串中的子字符串之后出现的连续数字组成的数字。例如,如果str = “g1e2ks1”那么结果字符串将是“geeks” 。
例子:
Input: str = “2a10bd3”
Output: aaaaaaaaaabdbdbd
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
方法:找到第一个有效的子字符串,即不包含任何数字的子字符串,然后使用 parseInt() 解析在找到的子字符串之后出现的整数,然后将找到的子字符串重复所需的次数。对所有有效的子字符串重复这些步骤,然后打印结果字符串。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
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 = str[startNum] - '0';
// 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
输出:
geeksforgeeks