Given two strings s1 and s2(all letters in uppercase). Check if it is possible to convert s1 to s2 by performing following operations.
- Make some lowercase letters uppercase.
- Delete all the lowercase letters.
Examples:
Input : s1 = daBcd s2 = ABC
Output : yes
Explanation : daBcd -> dABCd -> ABC
Convert a and b at index 1 and 3 to
upper case, delete the rest those are
lowercase. We get the string s2.
Input : s1 = argaju s2 = RAJ
Output : yes
Explanation : argaju -> aRgAJu -> RAJ
convert index 1, 3 and 4 to uppercase
and then delete. All lowercase letters
Input : s1 = ABcd s2= BCD
Output : NO
Approach:
Let DPi, j be 1 if it is possible to convert 1st i characters of s1 to j characters of s2, else DPi, j=0. Close observations gives us two conditions to deal with.
Initially DP0, 0=1, if DPi, j=1 then it is possible to check for next sets using following conditions.
- If s1[i] in upper case is equal to s2[j] then it is possible to convert i+1 characters of s1 to j+1 characters of s2, hence DPi+1, j+1=1.
- If s1[i] is in lower case, then it is possible to delete that element and hence i+1 characters can be converted to j characters of s2. Hence DPi+1, j=1.
If DPn, m=1, then it is possible to convert s1 to s2 by following conditions.
Below is the CPP illustration of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
bool check(string s1, string s2)
{
int n = s1.length();
int m = s2.length();
bool dp[n + 1][m + 1];
for ( int i = 0; i <= n; i++) {
for ( int j = 0; j <= m; j++) {
dp[i][j] = false ;
}
}
dp[0][0] = true ;
for ( int i = 0; i < s1.length(); i++) {
for ( int j = 0; j <= s2.length(); j++) {
if (dp[i][j]) {
if (j < s2.length() &&
( toupper (s1[i]) == s2[j]))
dp[i + 1][j + 1] = true ;
if (! isupper (s1[i]))
dp[i + 1][j] = true ;
}
}
}
return (dp[n][m]);
}
int main()
{
string s1 = "daBcd" ;
string s2 = "ABC" ;
if (check(s1, s2))
cout << "YES" ;
else
cout << "NO" ;
return 0;
}
|
Java
import java.io.*;
class GFG {
static boolean check(String s1, String s2)
{
int n = s1.length();
int m = s2.length();
boolean dp[][]= new boolean [n + 1 ][m + 1 ];
for ( int i = 0 ; i <= n; i++)
{
for ( int j = 0 ; j <= m; j++)
{
dp[i][j] = false ;
}
}
dp[ 0 ][ 0 ] = true ;
for ( int i = 0 ; i < s1.length(); i++)
{
for ( int j = 0 ; j <= s2.length(); j++)
{
if (dp[i][j]) {
if (j < s2.length() &&
(Character.toUpperCase(s1.charAt(i)) == s2.charAt(j)))
dp[i + 1 ][j + 1 ] = true ;
if (!Character.isUpperCase(s1.charAt(i)))
dp[i + 1 ][j] = true ;
}
}
}
return (dp[n][m]);
}
public static void main(String args[])
{
String s1 = "daBcd" ;
String s2 = "ABC" ;
if (check(s1, s2))
System.out.println( "YES" );
else
System.out.println( "NO" );
}
}
|
Python3
def check(s1,s2):
n = len (s1)
m = len (s2)
dp = ([[ False for i in range (m + 1 )]
for i in range (n + 1 )])
dp[ 0 ][ 0 ] = True
for i in range ( len (s1)):
for j in range ( len (s2) + 1 ):
if (dp[i][j]):
if ((j < len (s2) and
(s1[i].upper() = = s2[j]))):
dp[i + 1 ][j + 1 ] = True
if (s1[i].isupper() = = False ):
dp[i + 1 ][j] = True
return (dp[n][m])
if __name__ = = '__main__' :
s1 = "daBcd"
s2 = "ABC"
if (check(s1, s2)):
print ( "YES" )
else :
print ( "NO" )
|
C#
using System;
class GFG
{
static bool check( string s1, string s2)
{
int n = s1.Length;
int m = s2.Length;
bool [,] dp = new bool [n + 1, m + 1];
for ( int i = 0; i <= n; i++)
{
for ( int j = 0; j <= m; j++)
{
dp[i, j] = false ;
}
}
dp[0, 0] = true ;
for ( int i = 0; i < s1.Length; i++)
{
for ( int j = 0; j <= s2.Length; j++)
{
if (dp[i, j])
{
if (j < s2.Length &&
(Char.ToUpper(s1[i]) == s2[j]))
dp[i + 1, j + 1] = true ;
if (!Char.IsUpper(s1[i]))
dp[i + 1, j] = true ;
}
}
}
return (dp[n, m]);
}
public static void Main()
{
string s1 = "daBcd" ;
string s2 = "ABC" ;
if (check(s1, s2))
Console.Write( "YES" );
else
Console.Write( "NO" );
}
}
|
Javascript
<script>
function check(s1,s2)
{
let n = s1.length;
let m = s2.length;
let dp= new Array(n + 1);
for (let i = 0; i <= n; i++)
{
dp[i]= new Array(m+1);
for (let j = 0; j <= m; j++)
{
dp[i][j] = false ;
}
}
dp[0][0] = true ;
for (let i = 0; i < s1.length; i++)
{
for (let j = 0; j <= s2.length; j++)
{
if (dp[i][j]) {
if (j < s2.length &&
(s1[i].toUpperCase() == s2[j]))
dp[i + 1][j + 1] = true ;
if (!(s1[i] == s1[i].toUpperCase()))
dp[i + 1][j] = true ;
}
}
}
return (dp[n][m]);
}
let s1 = "daBcd" ;
let s2 = "ABC" ;
if (check(s1, s2))
document.write( "YES" );
else
document.write( "NO" );
</script>
|
Time Complexity: O(N*M) where N and M are the lengths of the strings.
Auxiliary Space: O(N*M)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!