将字符串转换为另一个字符串所需的最小操作数


给定两个字符串 A 和 B,任务是将字符串 A 转换为字符串 B(如果可能)。你只能执行一种操作,即从 A 中取出任何字符并将其插入到开头。检查是否可以转换字符串。如果是,则输出转换所需的最小操作数。

输入输出场景

假设我们有两个字符串 A 和 B,其值分别为“ABD”和“BAD”,将第一个字符串转换为第二个字符串所需的操作是 1,即交换前两个字符。

输入

A = "ABD", B = "BAD"

输出

1

考虑另一个场景

输入

A = "EACBD", B = "EABCD"

输出

3

将 A 转换为 B 所需的操作是:

  • 取 B 并放在前面,EACBD => BEACD

  • 取 A 并放在前面,BEACD => ABECD

  • 取 E 并放在前面,ABECD => EABCD

Python 实现

以下是 Python 实现

示例

def transformString(A, B):
    if len(A) != len(B):
        return -1    
    count = 0
    i = len(A) - 1
    j = len(B) - 1
    
    while i >= 0 and j >= 0:
        if A[i] == B[j]:
            i -= 1
            j -= 1
        else:
            count += 1
            i -= 1    
    return count
A = "Hello Welcome to Tutorialspoint    "
B = "Tutorialspoint simply easy learning"
print("Operations Required: ", transformString(A, B))  

A = "EACBD"
B = "EABCD"
print("Operations Required: ", transformString(A, B)) 

输出

Operations Required:  35
Operations Required:  3

方法

让我们通过调试上述程序来了解所采用的方法。

  • 该函数首先确定 A 和 B 的长度是否相等。如果长度不相等,则函数返回 -1,因为无法通过在开头添加字母来将 A 更改为 B。

  • 当 A 和 B 都具有相同的长度时,函数初始化两个指针 i 和 j,它们分别指向 A 和 B 的末尾,以及一个变量 count 为 0。

  • 之后,函数开始一个 while 循环,只要 i 和 j 都非负,该循环就会继续执行。

  • 在 while 循环内,函数检查 A[i] 处的字符是否等于 B[j] 处的字符。如果它们相等,则函数将 i 和 j 都递减 1,有效地跳过这些字符。

  • 如果字符不相等,则函数将 count 递增 1 并将 i 递减 1,有效地将 A[i] 处的字符“插入”到 A 的开头。

  • 然后,函数确定 while 循环终止后 j 是否为负。如果是,则 B 中的所有字符都已与其在 A 中的等效项匹配,并且 count 的值反映了将 A 更改为 B 所需的最小插入次数。函数返回 count。

  • 如果 j 不是负数,则无法通过在前面添加字符来将 A 更改为 B,因为 B 仍然包含未匹配的字符。当转换不可能时,函数返回 -1。

Java 实现

以上代码的 Java 实现

示例

import java.util.*;

public class Demo{
   public static int transformString(String A, String B) {
   if (A.length() != B.length()) {
      return -1;
   }
   int count = 0;
   int i = A.length() - 1;
   int j = B.length() - 1;

   while (i >= 0 && j >= 0) {
      if (A.charAt(i) == B.charAt(j)) {
         i--;
         j--;
      } else {
         count++;
         i--;
      }
   }
      return count;
   }

   public static void main(String[] args) {
      String A = "Hello Welcome to Tutorialspoint    ";
      String B = "Tutorialspoint simply easy learning";
      int result = transformString(A, B);
      System.out.println("Minimum number of operations required: " + result);

      A = "EACBD";
      B = "EABCD";
      result = transformString(A, B);
      System.out.println("Minimum number of operations required: " + result);
   }
}

输出

Minimum number of operations required: 35
Minimum number of operations required: 3

时间和空间复杂度

transform 函数的时间复杂度为 **O(n)**,其中 n 是输入字符串 A 和 B 的长度。这是因为该函数使用两个指针 i 和 j 从末尾到开头遍历字符串的字符,以定期比较字符并递增或递减指针和计数器。因此,时间复杂度与字符串的长度成正比。

transform 函数的空间复杂度为 **O(1)**,这意味着它需要的额外内存量与输入字符串的长度无关。该函数不创建任何额外的数据结构或动态分配内存;它只需要固定数量的内存来存储变量 count、i 和 j。

更新于:2023年8月22日

928 次浏览

启动您的 职业生涯

完成课程后获得认证

开始
广告