携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
题目描述
给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。
来源:力扣(LeetCode)
- 示例 1
输入: s1 = "bank", s2 = "kanb"
输出: true
解释: 例如,交换 s2 中的第一个和最后一个字符可以得到 "bank"
- 示例 2
输入: s1 = "attack", s2 = "defend"
输出: false
解释: 一次字符串交换无法使两个字符串相等
- 示例 3
输入: s1 = "kelb", s2 = "kelb"
输出: true
解释: 两个字符串已经相等,所以不需要进行字符串交换
- 示例 4
输入: s1 = "abcd", s2 = "dcba"
输出: false
提示:
1 <= s1.length, s2.length <= 100s1.length == s2.lengths1和s2仅由小写英文字母组成
思路分析
根据题意,题目给出两个字符串s1和s2,选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符,若两个字符串相等那么就返回true,否则返回false。
两个字符串有可能刚开始就相等了,所以这种情况可以直接返回true;先定义两个变量用来存放第一个遇到的不一致的字符s1和s2,定义一个变量flag存储是否已经进行过交换;循环其中一个字符串,若是字符不相等,就判断是否已经进行过交换了,若是已经交换过了,就直接返回false;判断是否有储存过不相等的字符,若是没有就直接存储,若是有就交叉判断字符是否相等,是的话就直接返回true,否则就返回false。
AC代码
function solution(str1, str2) {
if(str1 === str2) return true;
let s1 = '';
let s2 = '';
let flag = false;
for (let i=0; i<str1.length; i++) {
if(str1[i] !== str2[i]) {
if(flag) {
return false;
}
if(s1 === '') {
s1 = str1[i];
s2 = str2[i];
}else{
if(s1 === str2[i] && s2 === str1[i]) {
s1 = '';
flag = true;
}else{
return false;
}
}
}
}
return s1 === '' ? true : false;
}
let s1 = "bank", s2 = "kanb";
solution(s1, s2);