Meta Strings (Check if two strings can become same after a swap in one string)

11 Jul, 2022
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"
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.
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#
PHP
Python3
Javascript
// 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 stringsbool 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 == str2){       set<char>se(str1.begin(), str1.end());               //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[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 codeint main(){    string str1 = "converse";    string str2 = "converse";     areMetaStrings(str1,str2) ? cout << "Yes"                            : cout << "No";    return 0;}
// C# program to check if two strings// are meta stringsusing 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.
<?php// php program to check if two strings// are meta strings // Returns true if str1 and str2 are// meta stringsfunction 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.?>
# Python program to check if two strings# are meta strings # Returns true if str1 and str2 are meta stringsdef 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 methodstr1 = "converse"str2 = "converse"if ( areMetaStrings(str1,str2) ) :    print("Yes")else:    print("No")     # This code is contributed by Koulick Sadhu.
<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>
Yes
Time Complexity: O(N*log N) where N is the length of the string.Auxiliary Space: O(N)
This article is contributed by Sahil Chhabra (akku). If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. 
Sam007
nitin mittal
koulick_sadhu
rdtank
pushpeshrajdx01
hardikkoriintern
Google
Strings
Google
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.