 GeeksforGeeks App
Open App Browser
Continue

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

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"```

Recommended Practice

Below are steps used in the algorithm.

1. Check if both strings are of equal length or not, if not return false.
2. Otherwise, start comparing both strings and count number of unmatched characters and also store the index of unmatched characters.
3. If unmatched characters are more than 2 then return false.
4. Otherwise check if on swapping any of these two characters in any string would make the string equal or not.
5. If yes then return true. Otherwise return false.

Implementation:

## C++

 `// C++ program to check if two strings are meta strings``#include ``using` `namespace` `std;` `// Returns true if str1 and str2 are meta strings``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 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 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``int` `main()``{``    ``string str1 = ``"converse"``;``    ``string str2 = ``"converse"``;` `    ``areMetaStrings(str1,str2) ? cout << ``"Yes"``                            ``: cout << ``"No"``;``    ``return` `0;``}`

## 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 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

 ` 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.``?>`

## 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.`

## Javascript

 ``

## 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 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`

Output

`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.

My Personal Notes arrow_drop_up