仅执行一次字符串交换能否使两个字符串相等

204 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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 <= 100
  • s1.length == s2.length
  • s1 和 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);