天天看點

1790. 僅執行一次字元串交換能否使兩個字元串相等 : 簡單模拟題

題目描述

這是 LeetCode 上的 ​​1790. 僅執行一次字元串交換能否使兩個字元串相等​​ ,難度為 簡單。

Tag : 「模拟」

給你長度相等的兩個字元串 ​

​s1​

​​ 和 ​

​s2​

​ 。一次 字元串交換 操作的步驟如下:選出某個字元串中的兩個下标(不必不同),并交換這兩個下标所對應的字元。

如果對 其中一個字元串 執行 最多一次字元串交換 就可以使兩個字元串相等,傳回 ​

​true​

​​ ;否則,傳回 ​

​false​

​ 。

示例 1:

輸入:s1 = "bank", s2 = "kanb"

輸出:true

解釋:例如,交換 s2 中的第一個和最後一個字元可以得到 "bank"      

示例 2:

輸入:s1 = "attack", s2 = "defend"      

示例 3:

輸入:s1 = "kelb", s2 = "kelb"      

示例 4:

輸入:s1 = "abcd", s2 = "dcba"      

提示:

  • ​s1​

    ​​ 和​

    ​s2​

    ​ 僅由小寫英文字母組成

模拟

根據題意進行模拟即可 : 使用 ​

​a​

​​ 和 ​

​b​

​​ 記錄不同的位置下标,初始值為 ​

​-1​

​​,若「不同位置超過 個」或「隻有 個」直接傳回 ​​

​false​

​​,若「不存在不同位置」或「不同位置字元相同」,則傳回 ​

​true​

​。

Java 代碼:

class Solution {
    public boolean areAlmostEqual(String s1, String s2) {
        int n = s1.length(), a = -1, b = -1;
        for (int i = 0; i < n; i++) {
            if (s1.charAt(i) == s2.charAt(i)) continue;
            if (a == -1) a = i;
            else if (b == -1) b = i;
            else return false;
        }
        if (a == b && b == -1) return true;
        if (a == -1 || b == -1) return false;
        return      

TypeScript 代碼:

function areAlmostEqual(s1: string, s2: string): boolean {
    let n = s1.length, a = -1, b = -1
    for (let i = 0; i < n; i++) {
        if (s1[i] == s2[i]) continue
        if (a == -1) a = i
        else if (b == -1) b = i
        else return false
    }
    if (a == -1 && b == -1) return true
    if (a == -1 || b == -1) return false
    return      

Python 代碼:

class Solution:
    def areAlmostEqual(self, s1: str, s2: str) -> bool:
        n, a, b = len(s1), -1, -1
        for i in range(n):
            if s1[i] == s2[i]:
                continue
            if a == -1:
                a = i
            elif b == -1:
                b = i
            else:
                return False
        if a == b == -1:
            return True
        if a == -1 or b == -1:
            return False
        return s1[a] == s2[b] and      
  • 時間複雜度:
  • 空間複雜度:

最後

這是我們「刷穿 LeetCode」系列文章的第 ​

​No.1790​

​ 篇,系列開始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道題目,部分是有鎖題,我們将先把所有不帶鎖的題目刷完。

在這個系列文章裡面,除了講解解題思路以外,還會盡可能給出最為簡潔的代碼。如果涉及通解還會相應的代碼模闆。