開啟章節選單
String Game
題目
有兩個字串 和 ,還有一個序列 。每一次會依照序列刪除 裡面的數字,請求出最多可以刪除幾次使得新的 仍舊包含 。(在每一次刪除資源後,編號不會改變)
(這裡的「包含」和平常的包含不一樣,這邊是指如果字串 能在刪除一些字元後得到字串 ,則 包含 。)
解題思路
一個一個刪除再檢查的時間複雜度為 ,太慢了。這時候一樣可以對答案二分搜。
如果刪除完 次後, 還包含 ,則刪除 次以內 也一定包含 。刪除 次後, 不包含 ,則刪除 次以上的 也一定不會包含 。
用對答案二分搜的技巧,時間複雜度優化成 。
常見錯誤
- 在刪除字元以後編號不會改變
- 要注意字串的 還有 是從 還是從 開始
完整程式碼
#include <bits/stdc++.h> using namespace std; int main() { string t, p; cin >> t >> p; vector<int> order(t.size()); for (int i = 0; i < t.size(); i++) { cin >> order[i]; } int l = 0, r = t.size(); while (l < r) { int m = (l + r + 1) / 2; vector<int> deleted(t.size()); for (int i = 0; i < m; i++) { deleted[order[i] - 1] = 1; } int cur = 0; for (int i = 0; i < t.size() && cur < p.size(); i++) { if (!deleted[i] && p[cur] == t[i]) { cur++; } } if (cur == p.size()) { l = m; } else{ r = m - 1; } } cout << l << "\n"; }