Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Chào mừng anh em quay trở lại với series LeetCode Daily Challenge! Lại là mình loser1 đây !!! Sau Ba ngày đầu tiên với những bài toán về xâu và stack, hôm nay chúng ta sẽ tiếp tục với một bài toán thú vị về xử lý xâu. Let’s crack it! 💪
Chào anh em, các ae có thể xem Đề bài và Solution của mình trên LeetCode nhé:
You are given a string s
.
You can perform the following process on s
any number of times:
i
in the string such that there is at least one character to the left of index i
that is equal to s[i]
, and at least one character to the right that is also equal to s[i]
.i
that is equal to s[i]
.i
that is equal to s[i]
.Return the minimum length of the final string s
that you can achieve.
Example 1:
Input: s = "abaacbcbb" Output: 5 Explanation: We do the following operations: - Choose index 2, then remove the characters at indices 0 and 3. The resulting string is s = "bacbcbb". - Choose index 3, then remove the characters at indices 0 and 5. The resulting string is s = "acbcb".
Example 2:
Input: s = "aa" Output: 2 Explanation: We cannot perform any operations, so we return the length of the original string.
Constraints:
1 <= s.length <= 2 * 105
s
consists only of lowercase English letters.Khi đọc đề bài này, điều đầu tiên mình nghĩ đến là làm sao để tối ưu việc xóa các ký tự. Mấu chốt nằm ở chỗ chúng ta cần tìm ra pattern của các ký tự giống nhau và xóa chúng một cách thông minh! 🤔
Mình xin phân tích chi tiết cách tiếp cận bài toán này:
Test Case 1: "abaacbcbb"
Bước 1: Chọn i = 2 ('a')
- Trước: "abaacbcbb"
- Xóa 'a' ở index 0 và 3
- Sau: "bacbcbb"
Bước 2: Chọn i = 3 ('b')
- Trước: "bacbcbb"
- Xóa 'b' ở index 0 và 5
- Sau: "acbcb"
-> Kết quả: 5
Test Case 2: "aa"
- Không thể thực hiện thao tác nào
-> Kết quả: 2
Ví dụ với "abaacbcbb":
- Đếm tần suất ban đầu:
'a': 3 lần -> có thể xóa 2 lần -> còn 1 'a'
'b': 4 lần -> có thể xóa 2 lần -> còn 2 'b'
'c': 2 lần -> không thể xóa
-> Xâu cuối cùng có độ dài 5
class Solution {
public:
int minimumLength(string s) {
// Sử dụng map để đếm tần suất
unordered_map<char, int> cnt;
// Bước 1: Đếm tần suất xuất hiện của mỗi ký tự
for (char c : s) {
cnt[c] += 1;
}
int ans = 0;
// Bước 2: Tính toán độ dài palindrome tối thiểu
for (auto it : cnt) {
// Nếu ký tự xuất hiện chẵn lần -> đóng góp 2
if (it.second % 2 == 0) {
ans += 2;
}
// Nếu ký tự xuất hiện lẻ lần -> đóng góp 1 (đặt ở giữa)
else {
ans += 1;
}
}
return ans;
}
};
int main() {
Solution sol;
// Test case 1: Xâu đơn giản
cout << "Test 1: " << sol.minimumLength("aabbaa") << endl;
// Expected: 4 (abba)
// Test case 2: Một ký tự
cout << "Test 2: " << sol.minimumLength("a") << endl;
// Expected: 1
// Test case 3: Nhiều ký tự lẻ
cout << "Test 3: " << sol.minimumLength("abcabc") << endl;
// Expected: 5 (abcba)
return 0;
}
Pro tip: Khi làm bài kiểu này, anh em nên:
Lại Code editor cho ae ……..
moi ngay 1 cmt
[…] LeetCode Daily Challenge Day 4(3223): Minimum Length of String After Operations […]