문자열이 있다고 가정합니다. 문자열의 왼쪽과 오른쪽 부분에 같은 문자가 포함된 문자열에서 균형 위치 수를 찾아야 합니다. 문자의 빈도는 중요하지 않습니다. 따라서 문자열이 "ABAABA"이면 균형 위치의 수는 3입니다. 이러한 위치는 AB|AABA, ABA|ABA, ABAA|BA입니다.
이를 해결하기 위해 우리는 몇 가지 효율적인 접근 방식을 따를 것입니다. 문자열을 순회한 후 우리는 먼저 모든 문자의 수로 옳다고 느낀다[]. 그런 다음 문자열을 왼쪽에서 오른쪽으로 이동합니다. 모든 문자에 대해 왼쪽[]에서 카운트를 증가시키고 오른쪽에서 카운트를 감소시킵니다. 트래버스되는 모든 지점에 대해 왼쪽에 0이 아닌 값이 있는 모든 문자의 오른쪽에도 0이 아닌 값이 있고 그 반대의 경우도 마찬가지입니다. 그런 다음 결과를 증가시키십시오.
예
#include <iostream>
#include <algorithm>
#define MAX_CHAR 256
using namespace std;
int countBalancePoints(string str) {
int left[MAX_CHAR] = {0};
int right[MAX_CHAR] = {0};
for (int i=0; i<str.length(); i++)
right[str[i]]++;
int count = 0;
for (int i=0; i < str.length() ; i++) {
left[str[i]]++;
right[str[i]]--;
int j;
for (j=0; j<MAX_CHAR; j++) {
if ( (left[j] == 0 && right[j] != 0) || (left[j] != 0 && right[j] == 0))
break;
}
if (j == MAX_CHAR)
count++;
}
return count;
}
int main() {
char str[] = "ABAABA";
cout << "Number of balance points: " << countBalancePoints(str);
} 출력
Number of balance points: 3