给定两个字符串str1和str2 ,任务是在使str1和str2相互排列所需的两个字符串之一上计算以下三种类型的最小操作数:
- 在字符串插入一个字符。
- 从字符串删除一个字符。
- 从另一个字符串替换字符一个字符。
注意:以上所有操作费用相同。
例子:
Input: str1 = “geeksforgeeks”, str2 = “geeksforcoder”
Output: 4
Explanation: Rearrange the string str2 to “geeksforcedor”
Replace the value of str1[8] to ‘c’.
Replace the value of str1[10] to ‘d’.
Replace the value of str1[11] to ‘o’.
Replace the value of str1[12] to ‘r’.
Therefore, the required output is 4.
Input: str1 = “geeks”, str2 = “keeg”
Output: 1
方法:可以使用哈希存储两个字符串的每个字符的频率来解决该问题。以下是解决该问题的观察结果:
X = Number of characters which are present in both string, str1 and str2.
N1 – X = Number of characters present only in str1.
N2 – X = Number of characters present only in str2.
Total number of replacement operations = min(N1 – X, N2 – X)
Total number of insert/rRemove operations = max(N1 – X, N2 – X) – min(N1 – X, N2 – X).
Therefore, total number of operations = max(N1 – X, N2 – X),
请按照以下步骤解决问题:
- 初始化两个数组,例如freq1 []和freq2 [] ,分别存储str1和str2所有字符的频率。
- 遍历这两个字符串和两个所述字符串的各字符的频率分别[]存储在阵列FREQ1 []和FREQ2。
- 遍历数组freq1 []和freq2 [] 。
- 对于每个第i个字符,如果freq1 [i]超过freq2 [i] ,则将freq1 [i]替换为freq1 [i] – freq2 [i] ,并将freq2 [i]设置为0 ,反之亦然。
- 最后,计算数组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)