Given two strings, the task is to check whether these strings are meta strings or not. Meta strings are the strings which can be made equal by exactly one swap in any of the strings. Equal string are not considered here as Meta strings.
Examples:
Input : str1 = "geeks"
str2 = "keegs"
Output : Yes
By just swapping 'k' and 'g' in any of string,
both will become same.
Input : str1 = "rsting"
str2 = "string
Output : No
Input : str1 = "Converse"
str2 = "Conserve"
Output : Yes
By just swapping 'v' and 's' in any of string,
both will become same.
Input : str1 = "converse"
str2 = "converse"
Output : No
As mentioned in problem statemnet equal strings
are not Meta strings
Asked in : Google
Below are steps used in the algorithm.
- Check if both strings are of equal length or not, if not return false.
- Otherwise, start comparing both strings and count number of unmatched characters and also store the index of unmatched characters.
- If unmatched characters are more than 2 then return false.
- Otherwise check if on swapping any of these two characters in any string would make the string equal or not.
- If yes then return true. Otherwise return false.
Implementation:
C++
// C++ program to check if two strings are meta strings
#include <bits/stdc++.h>
using namespace std;
// Returns true if str1 and str2 are meta strings
bool areMetaStrings(string S1, string S2)
{
// Return false if both are not of equal length
if (S1.size() != S2.size())
return false;
// To store indexes of previously mismatched characters
int index[2];
// Store the count of mismatches
int count = 0;
for (int i = 0; i < S1.size(); i++) {
// If current character doesn't match
if (S1[i] != S2[i]) {
// If unmatched count is greater than 2, then
// return false
if (count >= 2)
return false;
// Store unmatched character and increment count
index[count] = i;
count++;
}
}
// Check if first unmatched character of S1 and second
// unmatched character S2 are equal and vice versa.
return count == 2
&& (S1[index[0]] == S2[index[1]]
&& S1[index[1]] == S2[index[0]]);
}
// Driver code
int main()
{
string str1 = "converse";
string str2 = "converse";
areMetaStrings(str1, str2) ? cout << "Yes"
: cout << "No";
return 0;
} // this code is contributed by shubhamg13
Java
import java.util.HashSet;
import java.util.Set;
public class Main {
// Returns true if str1 and str2 are meta strings
public static boolean areMetaStrings(String str1,
String str2)
{
int len1 = str1.length();
int len2 = str2.length();
// Return false if both are not of equal length
if (len1 != len2)
return false;
// If strings are equal
if (str1.equals(str2)) {
Set<Character> se = new HashSet<>();
for (char c : str1.toCharArray()) {
se.add(c);
}
// If there is a character,which occur more than
// once, we can swap, so that resultant string
// remains same
if (se.size() < str1.length()) {
return true;
}
return false;
}
// To store indexes of previously mismatched
// characters
int prev = -1, curr = -1;
int count = 0;
for (int i = 0; i < len1; i++) {
// If current character doesn't match
if (str1.charAt(i) != str2.charAt(i)) {
// Count number of unmatched character
count++;
// If unmatched are greater than 2, then
// return false
if (count > 2)
return false;
// Store both unmatched characters of
// both strings
prev = curr;
curr = i;
}
}
// Check if previous unmatched of string1
// is equal to curr unmatched of string2
// and also check for curr unmatched character,
// if both are same, then return true
return (count == 2
&& str1.charAt(prev) == str2.charAt(curr)
&& str1.charAt(curr) == str2.charAt(prev));
}
// Driver code
public static void main(String[] args)
{
String str1 = "converse";
String str2 = "converse";
if (areMetaStrings(str1, str2)) {
System.out.println("Yes");
}
else {
System.out.println("No");
}
}
} // this code is contributed by devendrasalunke
Python3
# Python program to check if two strings
# are meta strings
# Returns true if str1 and str2 are meta strings
def areMetaStrings( str1, str2) :
len1 = len(str1)
len2 = len(str2)
# Return false if both are not of equal length
if (len1 != len2) :
return False
if str1 == str2:
char_seen = []
for char in str1:
if char not in char_seen:
char_seen.append(char)
if len(char_seen) < len(str1):
return True
return False
# To store indexes of previously mismatched
# characters
prev = -1
curr = -1
count = 0
i = 0
while i < len1 :
# If current character doesn't match
if (str1[i] != str2[i] ) :
# Count number of unmatched character
count = count + 1
# If unmatched are greater than 2,
# then return false
if (count > 2) :
return False
# Store both unmatched characters of
# both strings
prev = curr
curr = i
i = i + 1
# Check if previous unmatched of string1
# is equal to curr unmatched of string2
# and also check for curr unmatched character,
# if both are same, then return true
return (count == 2 and str1[prev] == str2[curr]
and str1[curr] == str2[prev])
# Driver method
str1 = "converse"
str2 = "converse"
if ( areMetaStrings(str1,str2) ) :
print("Yes")
else:
print("No")
# This code is contributed by Koulick Sadhu.
C#
// C# program to check if two strings
// are meta strings
using System;
using System.Collections.Generic;
class GFG {
// Returns true if str1 and str2
// are meta strings
static bool areMetaStrings(String str1,
String str2)
{
int len1 = str1.Length;
int len2 = str2.Length;
// Return false if both are not of
// equal length
if (len1 != len2)
return false;
if(str1==str2){
var c = (new HashSet<char>(str1)).Count;
if (c<len1){
return true;
}
return false;
}
// To store indexes of previously
// mismatched characters
int prev = -1, curr = -1;
int count = 0;
for (int i = 0; i < len1; i++)
{
// If current character
// doesn't match
if (str1[i] != str2[i])
{
// Count number of unmatched
// character
count++;
// If unmatched are greater
// than 2, then return false
if (count > 2)
return false;
// Store both unmatched
// characters of both strings
prev = curr;
curr = i;
}
}
// Check if previous unmatched of
// string1 is equal to curr unmatched
// of string2 and also check for curr
// unmatched character, if both are
// same, then return true
return (count == 2 &&
str1[prev] == str2[curr] &&
str1[curr] == str2[prev]);
}
// Driver method
public static void Main()
{
String str1 = "converse";
String str2 = "conserve";
Console.WriteLine(
areMetaStrings(str1,str2)
? "Yes" :"No");
}
}
// This code is contributed by Sam007.
Javascript
<script>
// JavaScript program to check if two strings
// are meta strings
// Returns true if str1 and str2
// are meta strings
function areMetaStrings(str1, str2) {
var len1 = str1.length;
var len2 = str2.length;
// Return false if both are not of
// equal length
if (len1 !== len2) return false;
if (str1 === str2) {
var c = new Set(str1.split(""));
if (c < len1) {
return true;
}
return false;
}
// To store indexes of previously
// mismatched characters
var prev = -1,
curr = -1;
var count = 0;
for (var i = 0; i < len1; i++) {
// If current character
// doesn't match
if (str1[i] !== str2[i]) {
// Count number of unmatched
// character
count++;
// If unmatched are greater
// than 2, then return false
if (count > 2) return false;
// Store both unmatched
// characters of both strings
prev = curr;
curr = i;
}
}
// Check if previous unmatched of
// string1 is equal to curr unmatched
// of string2 and also check for curr
// unmatched character, if both are
// same, then return true
return (
count === 2 && str1[prev] === str2[curr] &&
str1[curr] === str2[prev]
);
}
// Driver method
var str1 = "converse";
var str2 = "conserve";
document.write(areMetaStrings(str1, str2) ? "Yes" : "No");
</script>
PHP
<?php
// php program to check if two strings
// are meta strings
// Returns true if str1 and str2 are
// meta strings
function areMetaStrings($str1, $str2)
{
$len1 = strlen($str1);
$len2 = strlen($str1);
// Return false if both are not
// of equal length
if ($len1 != $len2)
return false;
if($str1 == $str2){
$result = (count_chars($str1, len1));
if(strlen($result) < $len1){
return true;
}
return false;
}
// To store indexes of previously
// mismatched characters
$prev = -1; $curr = -1;
$count = 0;
for ($i = 0; $i < $len1; $i++)
{
// If current character
// doesn't match
if ($str1[$i] != $str2[$i])
{
// Count number of unmatched
// character
$count++;
// If unmatched are greater
// than 2, then return false
if ($count > 2)
return false;
// Store both unmatched
// characters of both
// strings
$prev = $curr;
$curr = $i;
}
}
// Check if previous unmatched of
// string1 is equal to curr unmatched
// of string2 and also check for curr
// unmatched character, if both are
// same, then return true
return ($count == 2 &&
$str1[$prev] == $str2[$curr] &&
$str1[$curr] == $str2[$prev]);
}
// Driver code
$str1 = "converse";
$str2 = "conserve";
if(areMetaStrings($str1, $str2))
echo "Yes";
else
echo "No";
// This code is contributed by nitin mittal.
?>
Output
Yes
Time Complexity: O(N*log N) where N is the length of the string.
Auxiliary Space: O(N)