Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Hey hey, it’s your boy Loser1 from Learning AI with Losers, back with another chill Leetcode Daily Challenge! 🌟 Hôm nay, chúng ta sẽ cùng nhau khám phá một bài toán thú vị liên quan đến chuỗi: Clear Digits. Chuẩn bị một tách cà phê ☕ và cùng mình bước vào hành trình giải quyết bài toán này nhé!
Bạn được cho một chuỗi s
. Nhiệm vụ của bạn là xóa tất cả các chữ số bằng cách thực hiện thao tác sau liên tục:
Xóa chữ số đầu tiên và ký tự không phải chữ số gần nhất bên trái của nó. Trả về chuỗi kết quả sau khi xóa tất cả chữ số.
Example 1:
Input: s = "abc" Output: "abc" Giải thích: Không có chữ số nào trong chuỗi.
Example 2:
Input: s = "cb34" Output: "" Giải thích: Đầu tiên áp dụng thao tác trên s[2], chuỗi trở thành "c4". Sau đó áp dụng thao tác trên s[1], chuỗi trở thành "".
Ràng buộc:
1 <= s.length <= 100
s
chỉ bao gồm chữ cái tiếng Anh viết thường và chữ sốBạn có một chuỗi s gồm các chữ cái thường ('a'
→ 'z'
) và các chữ số ('0'
→ '9'
). Mỗi khi gặp một chữ số trong chuỗi, bạn cần thực hiện hai việc:
Ví dụ:
"cb34"
→ c4
(xóa 3
và b
) → ""
(xóa 4
và c
).Thoạt nhìn, bài toán có vẻ phức tạp vì yêu cầu xóa cả ký tự trước đó, nhưng nếu bạn suy nghĩ kỹ, nó thực chất là một bài toán xử lý chuỗi theo thứ tự từ trái sang phải. Điều này gợi ý ngay lập tức về việc sử dụng Stack (ngăn xếp) – một cấu trúc dữ liệu tuyệt vời để xử lý các vấn đề liên quan đến "lưu trữ tạm thời" và "thao tác ngược". 🔥
Chúng ta sẽ sử dụng Stack để lưu trữ các ký tự chữ cái và xử lý từng ký tự trong chuỗi theo cách sau:
⏳ Quá trình xóa diễn ra từ trái sang phải, đúng như yêu cầu của bài toán!
class Solution {
public:
string clearDigits(string s) {
stack<char> mystk; // Khởi tạo stack để lưu chữ cái
// Duyệt qua từng ký tự trong chuỗi
for (char c : s) {
if (isdigit(c)) {
// Nếu là chữ số, xóa ký tự trước đó (nếu có)
if (!mystk.empty()) {
mystk.pop();
}
} else {
// Nếu là chữ cái, thêm vào stack
mystk.push(c);
}
}
// Tạo chuỗi kết quả từ các ký tự còn lại trong stack
string ans = "";
while (!mystk.empty()) {
ans += mystk.top(); // Lấy phần tử trên cùng của stack
mystk.pop();
}
// Đảo ngược chuỗi vì stack lấy từ cuối về đầu
reverse(ans.begin(), ans.end());
return ans;
}
};
Hãy cùng xem thuật toán hoạt động như thế nào với ví dụ s = "cb34" nhé! 🔍
Step | Ký tự hiện tại | Stack trạng thái | Hành động thực hiện |
---|---|---|---|
1️⃣ | 'c' | ['c'] | Thêm 'c' vào stack |
2️⃣ | 'b' | ['c', 'b'] | Thêm 'b' vào stack |
3️⃣ | '3' | ['c'] | Gặp chữ số '3' , pop 'b' ra khỏi stack |
4️⃣ | '4' | [] | Gặp chữ số '4' , pop 'c' ra khỏi stack |
📌 Cuối cùng, stack rỗng ⇒ Kết quả trả về là chuỗi rỗng ""
. Chính xác như mong đợi! ✅
🔥 Một bài toán khá đơn giản nhưng lại giúp ta ôn tập cách sử dụng Stack để xử lý chuỗi. Đây là những điểm quan trọng mình rút ra từ bài này:
✅ Stack rất hữu ích khi cần xử lý các phần tử theo thứ tự từ trái qua phải, đặc biệt là khi có yêu cầu "xoá phần tử trước đó".
✅ Cẩn thận với điều kiện stack không rỗng trước khi gọi pop()
để tránh lỗi!
✅ Ứng dụng trong thực tế: Kỹ thuật này rất giống với cách trình duyệt hoạt động khi bạn bấm nút "Back" để quay lại trang trước đó.
"12345"
) hoặc chuỗi rỗng (""
).Vậy là chúng ta đã hoàn thành bài Day 32 - Clear Digits! 🎉 Hy vọng bạn đã hiểu rõ cách sử dụng Stack để giải quyết bài toán này. Nếu bạn thấy bài viết hữu ích, đừng quên để lại comment và chia sẻ với bạn bè nhé! 🚀🔥
Hẹn gặp lại ở Day 33 với một thử thách thú vị khác từ Leetcode Daily Challenge! 💡
👉 Bạn có thích bài toán này không? Hãy để lại ý kiến của bạn dưới phần bình luận nhé! 💬👇
CODE EDITOR
📌 Hashtags:
#leetcode #leetcodedaily #coding #datastructures #algorithms #learningwithlosers