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

📅  最后修改于: 2021-10-28 01:39:11             🧑  作者: Mango

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

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

注意:以上所有操作都是等价的。

例子:

方法:使用Hashing存储字符串中每个字符出现的频率可以解决这个问题。以下是解决问题的意见:

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

  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


Javascript


输出:
4

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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程