【每日一题记录】1790. 仅执行一次字符串交换能否使两个字符串相等

55 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

大家好 我是丝瓜咸蛋汤。今天带来的是一道在LeetCode上的题目,题目难度为简单。就在此为大家分享一下解答思路。

题目阐述

给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。

如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。

来源:力扣(LeetCode)

思路阐述

这是一个很简单是脑筋急转弯一样的题目,首先两个字符串的长度是相等的,符合条件的s1和s2必须符合以下的条件:

  1. 只有两个地方是不同的
  2. 其他地方是相同的

所以只要一次遍历,记录两次下标的位置,然后互换,再返回s1互换后和s2做对比后是否相等的结果就可以了。

代码实现

function areAlmostEqual(s1: string, s2: string): boolean {
    let first = -1
    for (let i = 0; i < s1.length; i++) {
        if (s1.charAt(i) != s2.charAt(i)) {
            if (first == -1) {
                first = i
                continue
            }
            else { return s2 == swapString(s1, first, i) }
        }
    }
    return true&&(first<0)
};

function swapString(s1: string, index1: number, index2: number): string {
    return s1.substring(0, index1) + s1.charAt(index2) + s1.substring(index1 + 1, index2) + s1.charAt(index1) + s1.substring(index2 + 1, s1.length)
}

运行结果

执行用时:68 ms, 在所有 TypeScript 提交中击败了53.33%的用户

内存消耗:42.2 MB, 在所有 TypeScript 提交中击败了96.67%的用户

通过测试用例:131 / 131

代码评价

这里最后的返回结果之所以是return true&&(first<0) 是因为要考虑到输入的s1和s2如果只有一处地方是不相同的话那么直接判断不同字符的下标的数目即可。

我是丝瓜咸蛋汤
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!

名片.jpg