# Swapping positions | hackerearth practice problem

## Swapping positions | hackerearth practice problem:-

You are given two strings

$s$ and $t$ of length $n$. You can select any two positions (can be from the same or different strings) and swap the characters at those two positions. You have to perform this operation exactly once in such a way that there exists maximum one position $i$ $\left(1\le i\le n\right)$ such that ${s}_{i}!={t}_{i}$
Determine whether it is possible to perform the operation such that the given condition holds or not.

Input format

• First line: A single integer $T$ that denotes the number of test cases
• For each test case:
• First line: An integer $n$
• Next two lines: Strings $s$ and $t$ respectively

Output format

For each test case, print YES if a valid operation exists otherwise print NO in a single line.

Input constraints

• $1\le T\le 50$
• $1\le n\le {10}^{3}$
• Both the strings $s$ and $t$ contain only lowercase English alphabets
Sample Input
2
8
mrxismrx
mryismry
8
iamnomrx
iamdamry

Sample Output
YES
NO

Time Limit: 2
Memory Limit: 256
Source Limit:
Explanation

In the first test case, we can get a valid result by swapping the characters ${s}_{3}$ and ${t}_{8}$ (1 based indexing).

$10$

## Swapping positions | hackerearth practice problem Code:-

Here I am going to give you two solution first one is on the basis of C language and second one is on the basis of c++ language which you can submit in c++14 and c++17 also

Solution 1 ( C language):-

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
int main(){
int t, n;
scanf("%d", &t);
while(t-- > 0){
scanf("%d", &n);
char s1[n];
char s2[n];
scanf("%s %s", &s1, &s2);
int mismatched = 0;
bool swapped = false;
bool potentialMatch = false;
char char1 = '.';
char char2 = '.';
for(int i = 0; i < n; i++){
if(s1[i] != s2[i]){
mismatched++;
if(char1 == '.' && char2 == '.'){
char1 = s1[i];
char2 = s2[i];
}
else if(((char1 == s1[i] && char2 == s2[i])
|| (char2 == s1[i] && char1 == s2[i])) && !swapped){
mismatched -= 2;
swapped = true;
}
else if(char1 == s1[i] || char2 == s2[i]){
potentialMatch = true;
}
}
}
if(mismatched <= 1)
printf("YES\n");
else if(!swapped && potentialMatch && mismatched <= 2)
printf("YES\n");
else
printf("NO\n");
}
}

## Solution 2 ( C++ language):-

This solution is based on the c++ language and you can submit ib c++14 and c++17 also.
In this solution first three lines of the main function is only for the decreasing the time of execution of the program..
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

This is your choice that you want to use this or not but in some cases the code may take more time in execution and that time we need it .

#include<bits/stdc++.h>
using namespace std;
#define FF first
#define SS second
#define PB push_back
#define VI vector<long long int>
#define mod 1000000007
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define MS1(X) memset((X), -1, sizeof((X)))
#define MS0(X) memset((X), 0, sizeof((X)))
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
ll t=1;
cin >> t;
while(t--)
{
ll flag=0,n,i,j,count=0;
cin >> n ;
string s1,s2;
cin >> s1 >> s2;
vector<char> v1,v2;
for(i=0;i<n;i++) {
if(s1[i]!=s2[i]) {
v1.PB(s1[i]);
v2.PB(s2[i]);
}
}
if(v1.size()<=1) {
cout << "YES\n";
continue;
} else if((v1.size()>3)) {
cout << "NO\n";
continue;
} else if(v1.size()==2) {
if((v1[0]==v1[1])||(v2[0]==v2[1])||(v1[0]==v2[1])||(v1[1]==v2[0])) {
cout << "YES\n";
} else {
cout << "NO\n";
}
} else {
for(i=0;i<3;i++) {
for(j=0;j<3;j++) {
if(i!=j) {
if(((v1[i]==v2[j])&&(v1[j]==v2[i]))||((v1[i]==v1[j])
&&(v2[j]==v2[i]))) {
count=1;
break;
}
}
}
if(count==1) {
break;
}
}
if(count==1) {
cout << "YES\n";
} else {
cout << "NO\n";
}
}
}
}