Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

leetcode33.png

🌟 LeetCode Daily Challenge Day 33: 1910. Remove All Occurrences of a Substring

Daily LeetCode Challenge Day 33 – February 11th, 2025 MEDIUM #1910. Remove All Occurrences of a Substring “daabcbaabcbc” “dab” Stack Ninjutsu 🥋 ANNIHILATE SUBSTRINGS! 💥 Learning AI With Losers

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ả!

1910. Remove All Occurrences of a Substring

Medium
Đã giải: 222.5K Công ty: Không rõ

Cho hai chuỗi spart, 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
  • spart chỉ bao gồm các chữ cái tiếng Anh viết thường.

🧠 Intuition (Trực giác giải quyết)

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:

  1. Stack Samurai 🥷: Xây dựng một "pháo đài ký tự", kiểm tra từng "kẻ địch" xuất hiện ở cổng
  2. Brute Force Hulk 💪: Đập đi đập lại cho đến khi không còn gì sót lại (dễ hiểu, nhưng có thể không tối ưu)

🛠️ Approach (Cách tiếp cận)

Method 1: Stack Ninjutsu 🥋

Sử dụng stack như một bảo vệ hộp đêm 🕶️:

  1. Đẩy từng ký tự vào stack
  2. Sau mỗi lần thêm, kiểm tra xem phần cuối stack có khớp với part không
  3. CHÉM! ✂️ Nếu có, xóa ngay lập tức

🔥 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!


Method 2: Magic Eraser ✨

Nếu bạn thích sự đơn giản nhưng hiệu quả:

  1. Dò tìm part trong s
  2. XÓA NGAY! 🧼 Khi tìm thấy
  3. Lặp lại cho đến khi không còn xuất hiện nào nữa

⚠️ 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! 💆


⏱️ Complexity Analysis (Phân tích độ phức tạp)

Phương phápĐộ phức tạp thời gianĐộ phức tạp không gian
StackO(n * m) 🕰️O(n) 📦
MagicO(n * m) 💣O(1) 🎉

👨‍💻 Code Solutions (Lời giải)

Method 1: Stack Symphony 🎼

C++
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ả
    }
};

Method 2: Brute Force Bonanza 🔨

C++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! } }; " style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button">
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!
    }
};

🎯 Key Takeaways (Bài học rút ra)

  1. Stack approach giống như chơi Jenga 🪀 - cần cẩn thận loại bỏ từng mảnh mà không làm sụp đổ toàn bộ
  2. Brute force là phiên bản lập trình của một quả bóng giảm stress 🧶 - đơn giản nhưng hiệu quả
  3. Luôn nhớ: Việc xóa 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

quyminhhuy0@gmail.com
quyminhhuy0@gmail.com
Articles: 49

Newsletter Updates

Enter your email address below and subscribe to our newsletter

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
AI Assistant
Hi! How can I help you today?
: des sites vitrines aux boutiques en ligne, nous créons des sites web attractifs et efficaces.