列表

详情


NC251441. 一次交换

描述

小明在在报纸上看到了两个字符串,S_1 S_2

小明想知道能否使用恰好一次交换,交换 S_1 中的两个位置 (i,j) ,1\leq i < j \leq n

问能否使得 S_1=S_2 。

输入描述

输入共 3 行。

第一行表示 n\ (2≤n≤10^5),表示字符串长度。

第二行一个小写字母字符串 S_1,|S_1|=n

第三行一个小写字母字符串 S_2,|S_2|=n

输出描述

输出共 1 行,“YES"或“NO”(不包括双引号),表示能否使 S_1=S_2

示例1

输入:

5
abcda
bacda

输出:

YES

示例2

输入:

3
abc
abc

输出:

NO

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 57ms, 内存消耗: 7416K, 提交时间: 2023-05-06 09:59:30

n,a,b=int(input()),input(),input()
if a==b:
    for x in 'qazwsxedcrfvtgbyhnujmikolp':
        if a.count(x)>1:
            print('YES')
            break
    else:
        print("NO")
else:
    ans=[i for i in range(n) if a[i]!=b[i]]
    if len(ans)==2 and a[ans[0]]==b[ans[1]] and a[ans[1]]==b[ans[0]]:
        print("YES")
    else:
        print("NO")

C++(clang++ 11.0.1) 解法, 执行用时: 7ms, 内存消耗: 988K, 提交时间: 2023-05-08 23:15:50

#include<bits/stdc++.h>
using namespace std;
int n, a[1<<20], cnt, mx, f[26];
string s1, s2;
int main()
{
	cin >> n >> s1 >> s2;
	for(int i = 0; s1[i]; i++)
	{
		if(s1[i] - s2[i])
			a[cnt++] = i;
		mx = max(mx, ++f[s1[i]-'a']);	
	}
	if(cnt > 1)
		swap(s1[a[0]], s1[a[1]]);
	cout << ((cnt > 1|| mx > 1) && s1 == s2  ? "YES" : "NO"); 
}

pypy3 解法, 执行用时: 192ms, 内存消耗: 31964K, 提交时间: 2023-05-07 10:50:16

from collections import Counter

n = int(input())
a = input()
b = input()

if sorted(a) != sorted(b):
    print('NO')
    exit(0)

s = 0

for i in range(n):
    s += a[i] != b[i]
        
if s > 2:
    print('NO')
elif s == 2:
    print('YES')
elif len(Counter(a).items()) == n:
    print('NO')
else:
    print('YES')

上一题