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

ความยาวสูงสุดของสตริงสมดุลหลังสลับและลบตัวอักษรใน C++


เราได้รับสตริงที่ประกอบด้วยตัวอักษร (,),{,},[,] เท่านั้น เป้าหมายคือหาความยาวสูงสุดของสตริงที่ทำให้สมดุล (balanced) ได้โดยการสลับตัวอักษรติดกัน หรือลบตัวอักษรออก เราทำได้โดยเปรียบเทียบตัวอักษรติดกัน หากเป็นคู่ตรงข้าม สามารถสลับได้ ( }{, )(, ][ สลับได้ แต่ {{, )), [[, }}, )), ]] สลับไม่ได้)

นอกจากนี้ หากตัวอักษรไม่มีคู่ให้จับคู่ ก็สามารถลบออกได้ (เช่น "{{}][", ตัว { แรกลบได้ สตริงสมดุลยาว 4)

อินพุต

str[] = "{{{}}{]]][()" length 12

เอาต์พุต

Maximum length of balances string: 8

คำอธิบาย − str[0] และ str[1] สลับไม่ได้ ลบ str[0] → "{{}}{]]][()" str[1] และ str[2] สลับไม่ได้ ลบ str[1] → "{}}{]]][()" {} สมดุล }{ สลับได้ ลบ 2 ตัว ]] สลับ ][ และ () สมดุล สตริงสุดท้าย {}{}[]() ความยาว 8

อินพุต

str[] = "(((((()" length 7

เอาต์พุต

str[] = "(((((()" length 7

คำอธิบาย − มีแค่ str[5] และ str[6] สมดุล ลบตัวอื่นหมด สตริงสุดท้าย () ความยาว 2

วิธีการที่ใช้ในโปรแกรมด้านล่าง

  • อาเรย์ str[] เก็บสตริงต้นฉบับ Length เก็บความยาว
  • ฟังก์ชัน maxBalancedStr(char str[], int len) คืนค่าความยาวสตริงสมดุลสูงสุด
  • count เก็บความยาว เริ่มต้น 0
  • ลูปผ่านสตริง ตรวจสอบตัวอักษรติดกันว่าสลับได้เพื่อสมดุล หรือสมดุลอยู่แล้ว เพิ่ม count 2
  • ตรวจสอบคู่: (),)( และ {},}{ และ [],][ เพิ่ม i ด้วยเพื่อข้ามคู่ถัดไป
  • คืนค่า count

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

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

int maxBalancedStr(char str[20], int len) {
    int count = 0;
    for (int i = 0; i < len; i++) {
        if ((str[i] == '(' && str[i+1] == ')') || (str[i] == ')' && str[i+1] == '(')) {
            count += 2; ++i;
        } else if ((str[i] == '{' && str[i+1] == '}') || (str[i] == '}' && str[i+1] == '{')) {
            count += 2; ++i;
        } else if ((str[i] == '[' && str[i+1] == ']') || (str[i] == ']' && str[i+1] == '[')) {
            count += 2; ++i;
        }
    }
    return count;
}

int main() {
    char str[] = ")([]]((";
    int length = 7;
    cout << maxBalancedStr(str, length);
    return 0;
}

ผลลัพธ์

4