Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
By Loser1 from Learning AI with Loser
🔥 Sau một ngày tàn khốc bị toán tổ hợp “hủy diệt” không còn manh giáp, hôm nay Loser1 quyết định trút hết cơn giận lên bài LeetCode này! 💢 Hãy “đập nát” thử thách này như thể nó vừa mượn tiền mà chưa trả!
Cho hai chuỗi s
và part
, thực hiện thao tác sau trên s
cho đến khi tất cả các lần xuất hiện của chuỗi con part
bị xóa:
Tìm lần xuất hiện trái nhất của chuỗi con part
và xóa nó khỏi s
. Trả về chuỗi s
sau khi đã xóa tất cả các lần xuất hiện của part
.
Một chuỗi con là một chuỗi liên tiếp các ký tự trong một chuỗi.
Example 1:
Input: s = "daabcbaabcbc", part = "abc" Output: "dab" Giải thích: Các thao tác được thực hiện như sau: - s = "daabcbaabcbc", xóa "abc" bắt đầu tại vị trí 2, nên s = "dabaabcbc". - s = "dabaabcbc", xóa "abc" bắt đầu tại vị trí 4, nên s = "dababc". - s = "dababc", xóa "abc" bắt đầu tại vị trí 3, nên s = "dab". Bây giờ s không còn chứa "abc".
Example 2:
Input: s = "axxxxyyyyb", part = "xy" Output: "ab" Giải thích: Các thao tác được thực hiện như sau: - s = "axxxxyyyyb", xóa "xy" bắt đầu tại vị trí 4, nên s = "axxxyyyb". - s = "axxxyyyb", xóa "xy" bắt đầu tại vị trí 3, nên s = "axxyyb". - s = "axxyyb", xóa "xy" bắt đầu tại vị trí 2, nên s = "axyb". - s = "axyb", xóa "xy" bắt đầu tại vị trí 1, nên s = "ab". Bây giờ s không còn chứa "xy".
Ràng buộc:
1 <= s.length <= 1000
1 <= part.length <= 1000
s
và part
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 bóc một củ hành 🧅 - từng lớp, từng lớp, loại bỏ đi những phần đắng cho đến khi chỉ còn lại sự ngọt ngào. Đó cũng chính là điều chúng ta phải làm ở đây!
Nhiệm vụ của ta là xóa tất cả sự xuất hiện của part
trong s
. Nhưng có một vấn đề: việc xóa có thể tạo ra những "chuỗi con" mới giống part
!
Có hai cách tiếp cận:
Sử dụng stack như một bảo vệ hộp đêm 🕶️:
part
không🔥 Tại sao cách này hiệu quả?
Bằng cách kiểm tra ngay khi chèn, ta đảm bảo rằng các ký tự còn lại không thể kết hợp thành mẫu mới sau khi xóa. Giống như đang gỡ bom 💣 ngay khi phát hiện nguy hiểm!
Nếu bạn thích sự đơn giản nhưng hiệu quả:
part
trong s
⚠️ Lưu ý: Cách này có thể chậm với chuỗi lớn, nhưng đôi khi "phá hủy không cần suy nghĩ" lại giúp giải tỏa stress! 💆
Phương pháp | Độ phức tạp thời gian | Độ phức tạp không gian |
---|---|---|
Stack | O(n * m) 🕰️ | O(n) 📦 |
Magic | O(n * m) 💣 | O(1) 🎉 |
class Solution {
public:
string removeOccurrences(string s, string part) {
vector<char> stack;
int partSize = part.size();
for (char c : s) {
stack.push_back(c); // 🎵 Thêm ký tự vào stack
if (stack.size() >= partSize) {
bool match = true;
// 🔍 Kiểm tra phần cuối của stack có khớp với `part` không
for (int j = 0; j < partSize; j++) {
if (stack[stack.size() - partSize + j] != part[j]) {
match = false;
break;
}
}
// ✂️ Nếu khớp, xóa `part`
if (match) stack.resize(stack.size() - partSize);
}
}
return string(stack.begin(), stack.end()); // 🏁 Trả về kết quả
}
};
class Solution {
public:
string removeOccurrences(string s, string part) {
while (true) {
size_t pos = s.find(part); // 🕵️♂️ Tìm vị trí `part` trong `s`
if (pos == string::npos) break;
s.erase(pos, part.size()); // 💥 Xóa `part`
}
return s; // 🧼 Hoàn tất, chuỗi đã sạch bóng!
}
};
part
có thể tạo ra chuỗi con mới cần xóa tiếp! 🔄🚀 Loser's Wisdom of the Day:
"Lập trình cũng giống như gỡ rối tóc rối - đôi khi bạn phải đi qua cùng một đoạn nhiều lần. Nhưng cuối cùng, bạn sẽ có được một giải pháp mượt mà như lụa!" 💇
🔥 Ngày mai sẽ có gì? Một thử thách toán tổ hợp khác hay một màn chiến đấu AI căng não? Đón xem nhé! 💪
CODE EDITOR
📌 Hashtags:
#leetcode #leetcodedaily #coding #datastructures #algorithms #learningwithlosers