📌  相关文章
📜  最小化使两个给定字符串彼此置换所需的给定操作的计数

📅  最后修改于: 2021-04-29 06:45:26             🧑  作者: Mango

给定两个字符串str1str2 ,任务是在使str1str2相互排列所需的两个字符串之一上计算以下三种类型的最小操作数:

  1. 在字符串插入一个字符。
  2. 从字符串删除一个字符。
  3. 从另一个字符串替换字符一个字符。

注意:以上所有操作费用相同。

例子:

方法:可以使用哈希存储两个字符串的每个字符的频率来解决该问题。以下是解决该问题的观察结果:

请按照以下步骤解决问题:

  1. 初始化两个数组,例如freq1 []freq2 [] ,分别存储str1str2所有字符的频率。
  2. 遍历这两个字符串和两个所述字符串的各字符的频率分别[]存储在阵列FREQ1 []FREQ2。
  3. 遍历数组freq1 []freq2 []
  4. 对于每个i字符,如果freq1 [i]超过freq2 [i] ,则将freq1 [i]替换为freq1 [i] – freq2 [i] ,并将freq2 [i]设置为0 ,反之亦然。
  5. 最后,计算数组freq1 []freq2 []的总和,并打印它们之间的最大值作为答案

下面是实现上述方法的方法:

C++
// C++ program to implement
// the above approach
 
#include 
using namespace std;
 
// Function to minimize the count of
// operations to make str1 and str2
// permutations of each other
int ctMinEdits(string str1, string str2)
{
    int N1 = str1.length();
    int N2 = str2.length();
 
    // Store the frequency of
    // each character of str1
    int freq1[256] = { 0 };
    for (int i = 0; i < N1; i++) {
        freq1[str1[i]]++;
    }
 
    // Store the frequency of
    // each character of str2
    int freq2[256] = { 0 };
    for (int i = 0; i < N2; i++) {
        freq2[str2[i]]++;
    }
 
    // Traverse the freq1[] and freq2[]
    for (int i = 0; i < 256; i++) {
 
        // If frequency of character in
        // str1 is greater than str2
        if (freq1[i] > freq2[i]) {
            freq1[i] = freq1[i]
                       - freq2[i];
            freq2[i] = 0;
        }
 
        // Otherwise
        else {
            freq2[i] = freq2[i]
                       - freq1[i];
            freq1[i] = 0;
        }
    }
 
    // Store sum of freq1[]
    int sum1 = 0;
 
    // Store sum of freq2[]
    int sum2 = 0;
 
    for (int i = 0; i < 256; i++) {
        sum1 += freq1[i];
        sum2 += freq2[i];
    }
 
    return max(sum1, sum2);
}
 
// Driver Code
int main()
{
    string str1 = "geeksforgeeks";
    string str2 = "geeksforcoder";
    cout << ctMinEdits(str1, str2);
}


Java
// Java program to implement
// the above approach
import java.util.*;
import java.io.*;
import java.lang.Math;
 
class GFG{
     
// Function to minimize the count of
// operations to make str1 and str2
// permutations of each other
static int ctMinEdits(String str1, String str2)
{
    int N1 = str1.length();
    int N2 = str2.length();
   
    // Store the frequency of
    // each character of str1
    int freq1[] = new int[256];
    Arrays.fill(freq1, 0);
     
    for(int i = 0; i < N1; i++)
    {
        freq1[str1.charAt(i)]++;
    }
   
    // Store the frequency of
    // each character of str2
    int freq2[] = new int[256];
    Arrays.fill(freq2, 0);
     
    for(int i = 0; i < N2; i++)
    {
        freq2[str2.charAt(i)]++;
    }
   
    // Traverse the freq1[] and freq2[]
    for(int i = 0; i < 256; i++)
    {
         
        // If frequency of character in
        // str1 is greater than str2
        if (freq1[i] > freq2[i])
        {
            freq1[i] = freq1[i] - freq2[i];
            freq2[i] = 0;
        }
   
        // Otherwise
        else
        {
            freq2[i] = freq2[i] - freq1[i];
            freq1[i] = 0;
        }
    }
   
    // Store sum of freq1[]
    int sum1 = 0;
   
    // Store sum of freq2[]
    int sum2 = 0;
   
    for(int i = 0; i < 256; i++)
    {
        sum1 += freq1[i];
        sum2 += freq2[i];
    }
   
    return Math.max(sum1, sum2);
}
 
// Driver Code
public static void main(final String[] args)
{
    String str1 = "geeksforgeeks";
    String str2 = "geeksforcoder";
     
    System.out.println(ctMinEdits(str1, str2));
}
}
 
// This code is contributed by bikram2001jha


Python3
# Python3 program to implement
# the above approach
  
# Function to minimize the count of
# operations to make str1 and str2
# permutations of each other
def ctMinEdits(str1, str2):
     
    N1 = len(str1)
    N2 = len(str2)
  
    # Store the frequency of
    # each character of str1
    freq1 =  [0] * 256
    for i in range(N1):
        freq1[ord(str1[i])] += 1
     
    # Store the frequency of
    # each character of str2
    freq2 = [0] * 256
    for i in range(N2):
        freq2[ord(str2[i])] += 1
     
    # Traverse the freq1[] and freq2[]
    for i in range(256):
  
        # If frequency of character in
        # str1 is greater than str2
        if (freq1[i] > freq2[i]):
            freq1[i] = freq1[i] - freq2[i]
            freq2[i] = 0
  
        # Otherwise
        else:
            freq2[i] = freq2[i] - freq1[i]
            freq1[i] = 0
         
    # Store sum of freq1[]
    sum1 = 0
  
    # Store sum of freq2[]
    sum2 = 0
  
    for i in range(256):
        sum1 += freq1[i]
        sum2 += freq2[i]
     
    return max(sum1, sum2)
 
# Driver Code
str1 = "geeksforgeeks"
str2 = "geeksforcoder"
 
print(ctMinEdits(str1, str2))
 
# This code is contributed by code_hunt


C#
// C# program to implement
// the above approach
using System;
 
class GFG{
      
// Function to minimize the count of
// operations to make str1 and str2
// permutations of each other
static int ctMinEdits(string str1, string str2)
{
    int N1 = str1.Length;
    int N2 = str2.Length;
    
    // Store the frequency of
    // each character of str1
    int[] freq1 = new int[256];
    freq1[0] = str1[0];
      
    for(int i = 0; i < N1; i++)
    {
        freq1[str1[i]]++;
    }
    
    // Store the frequency of
    // each character of str2
    int[] freq2 = new int[256];
    freq2[0] = str2[0];
      
    for(int i = 0; i < N2; i++)
    {
        freq2[str2[i]]++;
    }
    
    // Traverse the freq1[] and freq2[]
    for(int i = 0; i < 256; i++)
    {
         
        // If frequency of character in
        // str1 is greater than str2
        if (freq1[i] > freq2[i])
        {
            freq1[i] = freq1[i] - freq2[i];
            freq2[i] = 0;
        }
    
        // Otherwise
        else
        {
            freq2[i] = freq2[i] - freq1[i];
            freq1[i] = 0;
        }
    }
    
    // Store sum of freq1[]
    int sum1 = 0;
    
    // Store sum of freq2[]
    int sum2 = 0;
    
    for(int i = 0; i < 256; i++)
    {
        sum1 += freq1[i];
        sum2 += freq2[i];
    }
    return Math.Max(sum1, sum2);
}
  
// Driver Code
public static void Main()
{
    string str1 = "geeksforgeeks";
    string str2 = "geeksforcoder";
      
    Console.WriteLine(ctMinEdits(str1, str2));
}
}
 
// This code is contributed by code_hunt


输出:
4




时间复杂度: O(N)
辅助空间: O(1)