สมมติว่าเรามีสตริง S ที่มีอักขระ n ตัว อักขระจะเป็น '+' หรือ '-' มีกองหิน n ครั้งที่เราเอาหินหนึ่งก้อนจากกองหรือเพิ่มหินหนึ่งก้อนลงในกอง กองไม่ว่างก่อนการดำเนินการแต่ละครั้งจะนำหินหนึ่งก้อนออกจากกอง เราต้องหาหินให้น้อยที่สุดเท่าที่จะเป็นไปได้ในกองหลังจากดำเนินการเหล่านี้ ถ้าเราเอาหินไปปฏิบัติครั้งที่ i S[i] จะเท่ากับ "-" หากเพิ่มเข้าไป S[i] จะเท่ากับ "+"
ดังนั้น หากอินพุตเป็น S ="++-++" ผลลัพธ์จะเป็น 3 หากเรามี 0 ก้อนในกองที่จุดเริ่มต้น หลังจากดำเนินการแล้ว จำนวนหินจะเท่ากับ 3
ขั้นตอน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
n := size of S for initialize i := 0, when i < n, update (increase i by 1), do: res := (if S[i] is same as '-', then maximum of res - 1 and 0, otherwise res + 1) return res
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; int solve(string S){ int n = S.size(), res = 0; for (int i = 0; i < n; i++) res = (S[i] == '-') ? max(res - 1, 0) : res + 1; return res; } int main(){ string S = "++-++"; cout << solve(S) << endl; }
อินพุต
"++-++"
ผลลัพธ์
3