題目描述
這是 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 道題目,部分是有鎖題,我們将先把所有不帶鎖的題目刷完。
在這個系列文章裡面,除了講解解題思路以外,還會盡可能給出最為簡潔的代碼。如果涉及通解還會相應的代碼模闆。