📌  相关文章
📜  检查是否可以将一个字符串转换为另一个字符串

📅  最后修改于: 2021-04-29 10:15:13             🧑  作者: Mango

给定两个字符串s1和s2(大写字母)。通过执行以下操作,检查是否可以将s1转换为s2。

例子:

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

方法:
如果可以将s1的第一个i字符转换为s2的j个字符,则将DP i,j设为1,否则DP i,j = 0。密切观察为我们提供了两个要处理的条件。

最初DP 0,0 = 1,如果DP i,j = 1,则可以使用以下条件检查下一组。
1.如果大写的s1 [i]等于s2 [j],则可以将s1的i + 1个字符转换为s2的j + 1个字符,因此DP i + 1,j + 1 = 1。

2.如果s1 [i]为小写字母,则可以删除该元素,因此i + 1个字符可以转换为s2的j个字符。因此, DP i + 1,j = 1。

如果DP n,m = 1,则可以通过以下条件将s1转换为s2

以下是上述方法的CPP说明。

C++
// cpp program to check if a string can
// be converted to another string by
// performing operations
#include 
using namespace std;
  
// function to check if a string can be
// converted to  another string by
// performing following operations
bool 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;
  
    // traverese 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 code
int main()
{
    string s1 = "daBcd";
    string s2 = "ABC";
  
    if (check(s1, s2))
        cout << "YES";
    else
        cout << "NO";
  
    return 0;
}


Java
// Java program to check if a string can
// be converted to another string by
// performing operations
import 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;
      
        // traverese 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
# 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 operations 
def 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
      
    # traverese 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 code 
if __name__=='__main__':
  
    s1 = "daBcd"
    s2 = "ABC"
    if (check(s1, s2)):
        print("YES")
    else:
        print("NO")
  
# this code is contributed by 
# sahilshelangia


C#
// C# program to check if a string can
// be converted to another string by
// performing operations
using System;
  
class GFG 
{
  
// function to check if a string can be
// converted to another string by
// performing following operations
static 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;
  
    // traverese 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 Code
public 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


输出:

YES