在不删除字符的情况下制作两个字符串 Anagram 所需的最小操作数
给定两个字符串s1和s2 ,我们需要找到在不删除任何字符的情况下生成两个字符串anagram 所需的最少操作次数。
注意: -字谜字符串具有相同的字符集,字符序列可以不同。
如果允许删除字符并给出成本,请参阅使两个字符串相同的最低成本
问题来源:Yatra.com 面试经历 |设置 7
例子:
Input :
s1 = "aba"
s2 = "baa"
Output : 0
Explanation: Both String contains identical characters
Input :
s1 = "ddcf"
s2 = "cedk"
Output : 2
Explanation : Here, we need to change two characters
in either of the strings to make them identical. We
can change 'd' and 'f' in s1 or 'e' and 'k' in s2.
假设:两个字符串的长度被认为是相似的
C++
// C++ Program to find minimum number
// of manipulations required to make
// two strings identical
#include
using namespace std;
// Counts the no of manipulations
// required
int countManipulations(string s1, string s2)
{
int count = 0;
// store the count of character
int char_count[26];
for (int i = 0; i < 26; i++)
{
char_count[i] = 0;
}
// iterate though the first String
// and update count
for (int i = 0; i < s1.length(); i++)
char_count[s1[i] - 'a']++;
// iterate through the second string
// update char_count.
// if character is not found in
// char_count then increase count
for (int i = 0; i < s2.length(); i++)
{
char_count[s2[i] - 'a']--;
}
for(int i = 0; i < 26; ++i)
{
if(char_count[i] != 0)
{
count+=abs(char_count[i]);
}
}
return count / 2;
}
// Driver code
int main()
{
string s1 = "ddcf";
string s2 = "cedk";
cout<
Java
// Java Program to find minimum number of manipulations
// required to make two strings identical
public class Similar_strings {
// Counts the no of manipulations required
static int countManipulations(String s1, String s2)
{
int count = 0;
// store the count of character
int char_count[] = new int[26];
// iterate though the first String and update
// count
for (int i = 0; i < s1.length(); i++)
char_count[s1.charAt(i) - 'a']++;
// iterate through the second string
// update char_count.
// if character is not found in char_count
// then increase count
for (int i = 0; i < s2.length(); i++)
{
char_count[s2.charAt(i) - 'a']--;
}
for(int i = 0; i < 26; ++i)
{
if(char_count[i] != 0)
{
count+= Math.abs(char_count[i]);
}
}
return count / 2;
}
// Driver code
public static void main(String[] args)
{
String s1 = "ddcf";
String s2 = "cedk";
System.out.println(countManipulations(s1, s2));
}
}
Python3
# Python3 Program to find minimum number
# of manipulations required to make
# two strings identical
# Counts the no of manipulations
# required
def countManipulations(s1, s2):
count = 0
# store the count of character
char_count = [0] * 26
for i in range(26):
char_count[i] = 0
# iterate though the first String
# and update count
for i in range(len( s1)):
char_count[ord(s1[i]) -
ord('a')] += 1
# iterate through the second string
# update char_count.
# if character is not found in
# char_count then increase count
for i in range(len(s2)):
char_count[ord(s2[i]) - ord('a')] -= 1
for i in range(26):
if char_count[i] != 0:
count += abs(char_count[i])
return count / 2
# Driver code
if __name__ == "__main__":
s1 = "ddcf"
s2 = "cedk"
print(countManipulations(s1, s2))
# This code is contributed by ita_c
C#
// C# Program to find minimum number
// of manipulations required to make
// two strings identical
using System;
public class GFG {
// Counts the no of manipulations
// required
static int countManipulations(string s1,
string s2)
{
int count = 0;
// store the count of character
int []char_count = new int[26];
// iterate though the first String
// and update count
for (int i = 0; i < s1.Length; i++)
char_count[s1[i] - 'a']++;
// iterate through the second string
// update char_count.
// if character is not found in
// char_count then increase count
for (int i = 0; i < s2.Length; i++)
char_count[s2[i] - 'a']--;
for(int i = 0; i < 26; ++i)
{
if(char_count[i] != 0)
{
count+= Math.Abs(char_count[i]);
}
}
return count / 2;
}
// Driver code
public static void Main()
{
string s1 = "ddcf";
string s2 = "cedk";
Console.WriteLine(
countManipulations(s1, s2));
}
}
// This code is contributed by vt_m.
PHP
Javascript
输出:
2
时间复杂度: O(n) ,其中n是字符串的长度。