Given a string str, the task is to check if it can be split into substrings such that each substring starts with a numeric value followed by a number of characters represented by that numeric integer. Examples:
Input: str = “4g12y6hunter” Output: Yes Explanation: Substrings “4g12y” and “6hunter” satisfy the given condition Input: str = “31ba2a” Output: No Explanation: The entire string cannot be split into substrings of desired types
Approach:
- Check for the conditions when a split is not possible:
- If the given string does not start with a number.
- If the integer, in the beginning of a substring, is greater than the total number of succeeding characters in the remaining substring.
- If the above two condition are not satisfied, an answer is definitely possible. Hence find the substrings recursively.
Below is the implementation of the above approach:
C++
// C++ Program to implement the // above approach #include <bits/stdc++.h> using namespace std;
// Function to check if the given // can be split into desired // substrings bool helper(string& s, int pos)
{ // Length of the string
int len = s.size();
if (pos >= len)
return true ;
if (! isdigit (s[pos]))
return false ;
int num = 0;
// Traverse the string
for ( int i = pos; i < len; i++) {
// Extract the digit
num = num * 10 + s[pos] - '0' ;
// Check if the extracted number
// does not exceed the remaining
// length
if (i + 1 + num > len)
return false ;
// Check for the remaining
// string
if (helper(s, i + 1 + num))
return true ;
}
// If generating desired
// substrings is not possible
return false ;
} // Driver Code int main()
{ string s = "123abc4db1c" ;
if (helper(s, 0))
cout << "Yes" ;
else
cout << "No" ;
} |
Java
// Java program to implement the // above approach import java.util.*;
class GFG{
// Function to check if the given // can be split into desired // substrings public static boolean helper(String s, int pos)
{ // Length of the string
int len = s.length();
if (pos >= len)
return true ;
if (!Character.isDigit(s.charAt(pos)))
return false ;
int num = 0 ;
// Traverse the string
for ( int i = pos; i < len; i++)
{
// Extract the digit
num = num * 10 + s.charAt(pos) - '0' ;
// Check if the extracted number
// does not exceed the remaining
// length
if (i + 1 + num > len)
return false ;
// Check for the remaining
// string
if (helper(s, i + 1 + num))
return true ;
}
// If generating desired
// substrings is not possible
return false ;
} // Driver code public static void main (String[] args)
{ String s = "123abc4db1c" ;
if (helper(s, 0 ))
System.out.print( "Yes" );
else
System.out.print( "No" );
} } // This code is contributed by divyeshrabadiya07 |
Python3
# Python3 program to implement the # above approach # Function to check if the given # can be split into desired # substrings def helper(s, pos):
# Length of the string
size = len (s)
if (pos > = size):
return True
if (s[pos].isdigit() = = False ):
return False
num = 0
# Traverse the string
for i in range (pos, size):
# Extract the digit
num = num * 10 + ord (s[pos]) - 48
# Check if the extracted number
# does not exceed the remaining
# length
if (i + 1 + num > size):
return False
# Check for the remaining
# string
if (helper(s, i + 1 + num)):
return True
# If generating desired
# substrings is not possible
return False
# Driver Code s = "123abc4db1c" ;
if (helper(s, 0 )):
print ( "Yes" )
else :
print ( "No" )
# This code is contributed by Sanjit_Prasad |
C#
// C# program to implement the // above approach using System;
class GFG{
// Function to check if the given // can be split into desired // substrings public static bool helper(String s, int pos)
{ // Length of the string
int len = s.Length;
if (pos >= len)
return true ;
if (! char .IsDigit(s[pos]))
return false ;
int num = 0;
// Traverse the string
for ( int i = pos; i < len; i++)
{
// Extract the digit
num = num * 10 + s[pos] - '0' ;
// Check if the extracted number
// does not exceed the remaining
// length
if (i + 1 + num > len)
return false ;
// Check for the remaining
// string
if (helper(s, i + 1 + num))
return true ;
}
// If generating desired
// substrings is not possible
return false ;
} // Driver code public static void Main(String[] args)
{ String s = "123abc4db1c" ;
if (helper(s, 0))
Console.Write( "Yes" );
else
Console.Write( "No" );
} } // This code is contributed by amal kumar choubey |
Javascript
// JavaScript program to implement the above approach // Function to check if the given // can be split into desired // substrings function helper(s, pos) {
// Length of the string
let size = s.length;
if (pos >= size) {
return true ;
}
if (!/^\d+$/.test(s[pos])) {
return false ;
}
let num = 0;
// Traverse the string
for (let i = pos; i < size; i++) {
// Extract the digit
num = num * 10 + parseInt(s[i]);
// Check if the extracted number
// does not exceed the remaining
// length
if (i + 1 + num > size) {
return false ;
}
// Check for the remaining
// string
if (helper(s, i + 1 + num)) {
return true ;
}
}
// If generating desired
// substrings is not possible
return false ;
} // Driver Code let s = "123abc4db1c" ;
if (helper(s, 0)) {
console.log( "Yes" );
} else {
console.log( "No" );
} //contributed by adityasha4x71 |
Output
Yes
Time Complexity: O(N)
Auxiliary Space: O(1)