Nhiệm vụ: tìm xâu con của xâu nhị phân cho trước sao cho hiệu giữa số 0 và số 1 lớn nhất, độ phức tạp O(n).
Ví dụ 1
Đầu vào** –
str = "10010110"
Đầu ra** – 2
Giải thích** – Xâu con vị trí 1-4 ("0010"): 3 số 0, 1 số 1, hiệu = 2.
Ví dụ 2
Đầu vào** –
str = "00000"
Đầu ra** – 5
Phương pháp O(n) - Kadane biến thể
- Tạo mảng
arrkích thước n+1, khởi tạo 0. - Duyệt j=1..n: nếu str[j-1]=='1' thì
arr[j] = max(arr[j-1]-1, -1); ngược lạiarr[j] = max(arr[j-1]+1, 1). - Kết quả = max của mảng
arr.
Ý tưởng: arr[j] lưu hiệu lớn nhất kết thúc tại vị trí j. Nếu gặp '1' (giá trị -1), hoặc mở rộng dãy cũ, hoặc bắt đầu mới tại -1. Tương tự cho '0' (+1).
Ví dụ
#include<bits/stdc++.h>
using namespace std;
int main() {
string str = "10010110";
int arr[str.length()+1];
memset(arr, 0, sizeof(arr));
for(int j=1; j<=str.length(); j++) {
if(str[j-1]=='1')
arr[j] = max(arr[j-1]-1, -1);
else
arr[j] = max(arr[j-1]+1, 1);
}
cout << *max_element(arr+1, arr+str.length()+1);
return 0;
}
Đầu ra
2