Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

แบ่งสตริงเป็นสตริงสมดุลใน C++

ปัญหา

สตริงสมดุล (Balanced String) คือสตริงที่มีจำนวน 'L' และ 'R' เท่ากัน กำหนดสตริงสมดุล s แบ่งเป็นสตริงสมดุลย่อยได้มากที่สุด คืนจำนวนสูงสุด เช่น "RLRRLLRLRL" → 4 ("RL", "RRLL", "RL", "RL")

วิธีแก้

  • cnt = 0, ans = 0
  • ลูป i = 0 ถึง n-1:
    • cnt = 0
    • ลูป j = i ถึง n-1:
      • ถ้า s[j]=='R' cnt++ ไม่งั้น cnt--
      • ถ้า j-i>0 และ cnt==0: ans++, i=j, break
  • คืน ans

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int balancedStringSplit(string s) {
        int cnt = 0, ans = 0;
        for (int i = 0; i < s.size(); i++) {
            cnt = 0;
            for (int j = i; j < s.size(); j++) {
                if (s[j] == 'R') cnt++;
                else cnt--;
                if (j - i > 0 && cnt == 0) {
                    ans++; i = j; break;
                }
            }
        }
        return ans;
    }
};

int main() {
    Solution ob;
    cout << ob.balancedStringSplit("RLLLLRRRLR");
}

อินพุต

"RLLLLRRRLR"

เอาต์พุต

3

คำอธิบาย

"RLLLLRRRLR" → แบ่งได้ 3 ส่วน: "RL", "LLRR", "RLR" (หรือ "RL", "LLRR", "RL", "R" - ตัวสุดท้ายไม่สมดุล)

อัลกอริทึม Greedy: ทุกครั้งที่ cnt กลายเป็น 0 (สมดุล) ตัดทันที จะได้จำนวนสูงสุด

เวอร์ชันที่ดีกว่า: Single Pass O(n) แค่นับ balance++/-- ทุกครั้ง balance==0 ans++