Check if a string can become empty by recursively deleting a given sub-string
Last Updated :
20 Mar, 2023
Given a string “str” and another string “sub_str”. We are allowed to delete “sub_str” from “str” any number of times. It is also given that the “sub_str” appears only once at a time. The task is to find if “str” can become empty by removing “sub_str” again and again.
Examples:
Input : str = "GEEGEEKSKS", sub_str = "GEEKS"
Output : Yes
Explanation : In the string GEEGEEKSKS, we can first
delete the substring GEEKS from position 4.
The new string now becomes GEEKS. We can
again delete sub-string GEEKS from position 1.
Now the string becomes empty.
Input : str = "GEEGEEKSSGEK", sub_str = "GEEKS"
Output : No
Explanation : In the string it is not possible to make the
string empty in any possible manner.
Method#1: A simple solution to solve this problem is by using inbuilt string functions find() and erase(). First input the sub-string substr for searching purpose in the original string str, then iterate the original string to find the index of the sub-string using find() which return starting index of the sub-string in the original string else -1 if not found and erase that sub-string using erase() until the length of the original string is greater than 0.
The above simple solutions work because the given substring appears only once at a time.
C++
#include<bits/stdc++.h>
using namespace std;
bool canBecomeEmpty(string str, string sub_str)
{
while (str.size() > 0)
{
int idx = str.find(sub_str);
if (idx == -1)
break ;
str.erase(idx, sub_str.size());
}
return (str.size() == 0);
}
int main()
{
string str = "GEEGEEKSKS" , sub_str = "GEEKS" ;
if (canBecomeEmpty(str, sub_str))
cout<< "\nYes" ;
else
cout<< "\nNo" ;
return 0;
}
|
Java
class GFG {
static boolean canBecomeEmpty(String str, String sub_str) {
while (str.length() > 0 ) {
int idx = str.indexOf(sub_str);
if (idx == - 1 ) {
break ;
}
str = str.replaceFirst(sub_str, "" );
}
return (str.length() == 0 );
}
public static void main(String[] args) {
String str = "GEEGEEKSKS" , sub_str = "GEEKS" ;
if (canBecomeEmpty(str, sub_str)) {
System.out.print( "\nYes" );
} else {
System.out.print( "\nNo" );
}
}
}
|
Python3
def canBecomeEmpty(string, sub_str):
while len (string) > 0 :
idx = string.find(sub_str)
if idx = = - 1 :
break
string = string.replace(sub_str, "", 1 )
return ( len (string) = = 0 )
if __name__ = = "__main__" :
string = "GEEGEEKSKS"
sub_str = "GEEKS"
if canBecomeEmpty(string, sub_str):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG
{
static Boolean canBecomeEmpty(String str, String sub_str)
{
while (str.Length > 0)
{
int idx = str.IndexOf(sub_str);
if (idx == -1)
{
break ;
}
str = str.Replace(sub_str, "" );
}
return (str.Length == 0);
}
public static void Main(String[] args)
{
String str = "GEEGEEKSKS" , sub_str = "GEEKS" ;
if (canBecomeEmpty(str, sub_str))
{
Console.Write( "\nYes" );
}
else
{
Console.Write( "\nNo" );
}
}
}
|
Javascript
function canBecomeEmpty(str, sub_str) {
while (str.length > 0) {
let idx = str.indexOf(sub_str);
if (idx == -1)
break ;
str = str.slice(0, idx) + str.slice(idx + sub_str.length);
}
return (str.length == 0);
}
let str = "GEEGEEKSKS" , sub_str = "GEEKS" ;
if (canBecomeEmpty(str, sub_str))
console.log( "Yes" );
else
console.log( "No" );
|
Time Complexity: O(N^2)
Auxiliary Space: O(N+M), where N is the length of the string and M is the length of sub-string.
Method#2: One possible solution would be to use the regular expression. Regular expressions modules are very helpful with string. The regular expression module has a search function that is used to find the patterns in the string. And replace function is used for replacing the characters of string.
Follow are the steps for our approach:
- Use the re.search function on a string to find the pattern in a string.
- Use the re.replace function to replace the sub-string from a string.
- Repeat steps one and two until there is a sub-string in the string after replacing it.
- At last if the string is empty after all replacing then it can become empty else it cannot become empty.
Example
C++
#include <bits/stdc++.h>
using namespace std;
bool canBecomeEmpty(string str1, string sub_str)
{
regex r(sub_str);
smatch m;
while (regex_search(str1, m, r)) {
str1 = regex_replace(str1, r, "" );
}
return true ? str1 == "" : false ;
}
int main()
{
string s = "GeeksForGeeGeeksks" ;
string k = "Geeks" ;
if (canBecomeEmpty(s, k)) {
cout << "\nYes" ;
}
else {
cout << "\nNo" ;
}
return 0;
}
|
Java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
static boolean canBecomeEmpty(String str1, String sub_str){
Pattern r = Pattern.compile(sub_str);
Matcher m;
while ((m = r.matcher(str1)).find()){
str1 = m.replaceAll( "" );
}
return str1.equals( "" );
}
public static void main(String[] args) {
String s = "GeeksForGeeGeeksks" ;
String k = "Geeks" ;
if (canBecomeEmpty(s, k)){
System.out.println( "Yes" );
}
else {
System.out.println( "No" );
}
}
}
|
Python3
import re
def canBecomeEmpty(string, sub_str):
while sub_str in string :
string = re.sub(sub_str, "", string)
return True if string = = "" else False
if __name__ = = "__main__" :
string = "GeeksforGeeGeeksks"
sub_str = "Geeks"
if canBecomeEmpty(string, sub_str):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
using System.Text.RegularExpressions;
public class Program
{
static bool CanBecomeEmpty( string str1, string sub_str)
{
Regex r = new Regex(sub_str);
Match m;
while (r.IsMatch(str1))
{
str1 = r.Replace(str1, "" );
}
return str1 == "" ? true : false ;
}
public static void Main()
{
string s = "GeeksForGeeGeeksks" ;
string k = "Geeks" ;
if (CanBecomeEmpty(s, k))
{
Console.WriteLine( "Yes" );
}
else
{
Console.WriteLine( "No" );
}
}
}
|
Javascript
function canBecomeEmpty(str,sub_str)
{
const regex = new RegExp(sub_str);
while (regex.test(str)){
str = str.replace(regex, '' )
}
return false ? str : true ;
}
let str = "GeeksForGeeGeeksks" , sub_str = "Geeks" ;
if (canBecomeEmpty(str, sub_str)) {
console.log( "Yes" );
} else {
console.log( "No" );
}
|
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...