Check if it is possible to transform one string to another - GeeksforGeeks

09 Sep, 2021
Given two strings s1 and s2(call letters in uppercase). Check if it is possible to convert s1 to s2 by performing following operations.
1. Make some lowercase letters uppercase. 2. 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. 1. 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.2. 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++
Java
Python3
C#
Javascript
// cpp program to check if a string can// be converted to another string by// performing operations#include <bits/stdc++.h>using namespace std; // function to check if a string can be// converted to  another string by// performing following operationsbool check(string s1, string s2){    // calculates length    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;        }    }    // mark 1st position as true    dp[0][0] = true;     // traverse for all DPi, j    for (int i = 0; i < s1.length(); i++) {        for (int j = 0; j <= s2.length(); j++) {             // if possible for to convert i            // characters of s1 to j characters            // of s2            if (dp[i][j]) {                 // if upper_case(s1[i])==s2[j]                // is same                if (j < s2.length() &&                    (toupper(s1[i]) == s2[j]))                    dp[i + 1][j + 1] = true;                 // if not upper then deletion is                // possible                if (!isupper(s1[i]))                    dp[i + 1][j] = true;            }        }    }     return (dp[n][m]);} // driver codeint main(){    string s1 = "daBcd";    string s2 = "ABC";     if (check(s1, s2))        cout << "YES";    else        cout << "NO";     return 0;}
// Java program to check if a string can// be converted to another string by// performing operationsimport java.io.*; class GFG {         // function to check if a string can be    // converted to another string by    // performing following operations    static boolean check(String s1, String s2)    {        // calculates length        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;            }        }        // mark 1st position as true        dp[0][0] = true;             // traverse for all DPi, j        for (int i = 0; i < s1.length(); i++)        {            for (int j = 0; j <= s2.length(); j++)            {                     // if possible for to convert i                // characters of s1 to j characters                // of s2                if (dp[i][j]) {                         // if upper_case(s1[i])==s2[j]                    // is same                    if (j < s2.length() &&                        (Character.toUpperCase(s1.charAt(i)) == s2.charAt(j)))                        dp[i + 1][j + 1] = true;                         // if not upper then deletion is                    // possible                    if (!Character.isUpperCase(s1.charAt(i)))                        dp[i + 1][j] = true;                }            }        }             return (dp[n][m]);    }         // driver code    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");         }} // This code is contributed by Nikita Tiwari.
# Python3 program to check if a string can# be converted to another string by# performing operations  # function to check if a string can be# converted to another string by# performing following operationsdef check(s1,s2):         # calculates length    n = len(s1)    m = len(s2)    dp=([[False for i in range(m+1)]       for i in range(n+1)])         # mark 1st position as true    dp[0][0] = True         # traverse for all DPi, j    for i in range(len(s1)):        for j in range(len(s2)+1):                         # if possible for to convert i            # characters of s1 to j characters            # of s2            if (dp[i][j]):                                 # if upper_case(s1[i])==s2[j]                # is same                if ((j < len(s2) and                   (s1[i].upper()== s2[j]))):                    dp[i + 1][j + 1] = True                                     # if not upper then deletion is                # possible                if (s1[i].isupper()==False):                    dp[i + 1][j] = True    return (dp[n][m]) # driver codeif __name__=='__main__':     s1 = "daBcd"    s2 = "ABC"    if (check(s1, s2)):        print("YES")    else:        print("NO") # this code is contributed by# sahilshelangia
// C# program to check if a string can// be converted to another string by// performing operationsusing System; class GFG{ // function to check if a string can be// converted to another string by// performing following operationsstatic bool check(string s1, string s2){    // calculates length    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;        }    }         // mark 1st position as true    dp[0, 0] = true;     // traverse for all DPi, j    for (int i = 0; i < s1.Length; i++)    {        for (int j = 0; j <= s2.Length; j++)        {             // if possible for to convert i            // characters of s1 to j characters            // of s2            if (dp[i, j])            {                 // if upper_case(s1[i])==s2[j]                // is same                if (j < s2.Length &&                    (Char.ToUpper(s1[i]) == s2[j]))                    dp[i + 1, j + 1] = true;                 // if not upper then deletion is                // possible                if (!Char.IsUpper(s1[i]))                    dp[i + 1, j] = true;            }        }    }     return (dp[n, m]);} // Driver Codepublic static void Main(){    string s1 = "daBcd";    string s2 = "ABC";     if (check(s1, s2))        Console.Write("YES");    else        Console.Write("NO");}} // This code is contributed// by ChitraNayal
<script>// Javascript program to check if a string can// be converted to another string by// performing operations              // function to check if a string can be    // converted to another string by    // performing following operations    function check(s1,s2)    {        // calculates length        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;            }        }        // mark 1st position as true        dp[0][0] = true;               // traverse for all DPi, j        for (let i = 0; i < s1.length; i++)        {            for (let j = 0; j <= s2.length; j++)            {                                           // if possible for to convert i                // characters of s1 to j characters                // of s2                if (dp[i][j]) {                           // if upper_case(s1[i])==s2[j]                    // is same                    if (j < s2.length &&                        (s1[i].toUpperCase() == s2[j]))                        dp[i + 1][j + 1] = true;                           // if not upper then deletion is                    // possible                                         if (!(s1[i] == s1[i].toUpperCase()))                        dp[i + 1][j] = true;                }            }        }               return (dp[n][m]);    }         // driver code    let s1 = "daBcd";    let s2 = "ABC";    if (check(s1, s2))        document.write("YES");    else        document.write("NO");               // This code is contributed by avanitrachhadiya2155</script>
Output: 
YES
 
sahilshelangia
ukasp
nidhi_biet
avanitrachhadiya2155
simmytarika5
Dynamic Programming
Strings
Strings
Dynamic Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Bellman–Ford Algorithm | DP-23
Floyd Warshall Algorithm | DP-16
Subset Sum Problem | DP-25
Coin Change | DP-7
Matrix Chain Multiplication | DP-8
Reverse a string in Java
Write a program to reverse an array or string
C++ Data Types
Python program to check if a string is palindrome or not
Check for Balanced Brackets in an expression (well-formedness) using Stack