Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Xin chào các bạn yêu quý của Learning AI With Losers! Mình là Loser1 đây!
Sau một ngày lười biếng bỏ lỡ Day 26 😅, hôm nay chúng ta quay trở lại với bài Easy thứ 5 trong series về swap chuỗi! Let’s find our string soulmates! 🎭
Bạn được cung cấp hai chuỗi s1
và s2
có độ dài bằng nhau. Một phép hoán đổi chuỗi là thao tác chọn hai chỉ số trong một chuỗi (không nhất thiết phải khác nhau) và hoán đổi các ký tự tại các chỉ số đó.
Trả về true
nếu có thể làm cho cả hai chuỗi bằng nhau bằng cách thực hiện tối đa một phép hoán đổi chuỗi trên chính xác một trong hai chuỗi. Nếu không, trả về false
.
Ví dụ:
Example 1:
Input: s1 = "bank", s2 = "kanb" Output: true Explanation: Ví dụ, hoán đổi ký tự đầu tiên với ký tự cuối cùng của s2 để tạo thành "bank".
Example 2:
Input: s1 = "attack", s2 = "defend" Output: false Explanation: Không thể làm cho chúng bằng nhau với một phép hoán đổi chuỗi.
Example 3:
Input: s1 = "kelb", s2 = "kelb" Output: true Explanation: Hai chuỗi đã bằng nhau, do đó không cần thực hiện phép hoán đổi chuỗi nào.
Ràng buộc:
1 <= s1.length, s2.length <= 100
s1.length == s2.length
s1
và s2
chỉ bao gồm các chữ cái tiếng Anh viết thường.Hãy tưởng tượng bạn đang chơi trò ghép đôi chữ cái:
s1: "b a n k"
s2: "k a n b"
⬇️ ⬇️
Swap hai chữ này!
Hoặc:
s1: "k e l b"
s2: "k e l b"
✨ Perfect match!
Giống như trò chơi tìm cặp đôi hoàn hảo:
Perfect Match:
k e l b
k e l b
✅ Không cần swap!
One Swap Needed:
b a n k
k a n b
🔄 Chỉ cần 1 lần swap!
Mission Impossible:
a t t a c k
d e f e n d
❌ Không thể match!
Kiểm tra từng cặp ký tự:
Match Counter:
b ≠ k (Diff #1)
a = a (Match!)
n = n (Match!)
k ≠ b (Diff #2)
Điều kiện hợp lệ:
class Solution {
public:
bool areAlmostEqual(string s1, string s2) {
if (s1.length() != s2.length()) return false;
int diff_count = 0;
char s1_first = '\0', s1_second = '\0';
char s2_first = '\0', s2_second = '\0';
for (int i = 0; i < s1.length(); i++) {
if (s1[i] != s2[i]) {
diff_count++;
if (diff_count == 1) {
s1_first = s1[i];
s2_first = s2[i];
} else if (diff_count == 2) {
s1_second = s1[i];
s2_second = s2[i];
} else return false;
}
}
return (diff_count == 0) ||
(diff_count == 2 && s1_first == s2_second && s1_second == s2_first);
}
};
Input: s1: "bank" s2: "kanb"
Phân tích từng bước:
Kết quả: true (đổi b↔k là xong!)
Input: s1: "attack" s2: "defend"
Phân tích:
Input: s1: "kelb" s2: "kelb"
Phân tích:
Chỉ cần duyệt qua chuỗi một lần: k → e → l → b ⏱️ Tăng tuyến tính theo độ dài chuỗi
Chỉ dùng: 🧮 Vài biến đơn giản:
Sau một ngày nghỉ ngơi, hi vọng bài viết này giúp các bạn "khởi động" lại! Đôi khi lười biếng cũng cần thiết, miễn là biết quay lại đúng lúc! 😊
Follow mình tại Learning AI with Loser để cập nhật các bài giải Leetcode hàng ngày nhé! 💻✨
CODE EDITOR
#leetcode #leetcodedaily #algorithms #programming #learningwithlosers #stringmanipulation #codinglife