Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++로 프로그램을 작성하여 '1'로 시작하고 '1'로 끝나는 부분 문자열의 수를 세십시오.

<시간/>

문자열 'str'의 길이와 문자열을 지정했다고 가정해 보겠습니다. 작업은 주어진 이진 문자열에서 '1'로 시작하고 '1'로 끝나는 부분 문자열의 수를 계산하는 것입니다. 이진 문자열에는 '1'과 '0'만 포함됩니다. 예를 들어,

입력-1 -

N = 5
str = ‘11101’

출력 -

6

설명 − 주어진 Binary String에는 '1'로 시작하고 '1'로 끝나는 6개의 부분 문자열이 있습니다. 이러한 부분 문자열의 집합은 {'11', '111', '1110', '11101', '1101', '101'}입니다.

입력-1 -

N = 4
str = ‘0011’

출력 -

1

설명 -

주어진 이진 문자열에는 '1'로 시작하고 '1'로 끝나는 1개의 하위 문자열이 있습니다. 이 부분 문자열의 집합은 단일 집합, 즉 { '11 '}입니다.

이 문제를 해결하기 위해 사용된 접근 방식

주어진 문자열에 대해 '1'로 시작하고 '1'로 끝나는 부분 문자열의 수를 계산해야 합니다. 이 문제는 'n'명의 파티에서 핸드셰이크 횟수를 계산해야 하는 잘 알려진 핸드셰이크 문제와 유사합니다.

주어진 문자열에서 1의 개수를 세면 '1'로 시작하고 '1'로 끝나는 부분 문자열 집합을 찾을 수 있습니다.

  • N 길이의 문자열을 입력하십시오.

  • 정수 함수 countSubstring(int N, string s)은 문자열의 길이와 문자열을 입력으로 받아 '1'로 시작하고 '1'로 끝나는 모든 부분 문자열의 개수를 반환합니다.

  • 전체 문자열을 반복하고 숫자를 세십시오. 문자열의 '1' 중.

  • 번호를 계산합니다. n*(n-1)/2로 주어진 문자열의 하위 문자열(쌍)의

  • n*(n-1)/2의 결과를 반환합니다.

예시

#include<iostream>
using namespace std;
int countSubstring(int N, string s){
   int count=0;
   for(int i=0; s[i]!= '\0'; ++i){
      if( s[i]== '1' )
         count++;
   }
   return count*(count-1)/2;
}
int main() {
   int N=5;
   string str= "11101";
   cout<< countSubstring(N,str)<<endl;
   return 0;
}

출력

위의 코드를 실행하면 출력이 다음과 같이 인쇄됩니다.

6

주어진 문자열에 존재하는 '1'의 개수는 '4' 즉 count =4이므로 '1'로 시작하여 '1'로 끝나는 부분 문자열의 총 개수는 4*(4-1)/2입니다. =6.