给定两个字符串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
方法:使用Hashing存储字符串中每个字符出现的频率可以解决这个问题。以下是解决问题的意见:
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
Javascript
4
时间复杂度: O(N)
辅助空间: O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。