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

C++에서 K개를 포함하는 이진 문자열의 부분 문자열 개수

<시간/>

2진수 문자열, 즉 0과 1의 조합과 정수 값 k가 주어지고 주어진 k 1을 갖는 주어진 이진 문자열로 형성된 부분 문자열의 개수를 계산하는 것이 작업입니다.

입력 - 문자열 str ='10000100000', k =2

출력 − K개를 포함하는 이진 문자열의 부분 문자열 수는 − 6

설명 − 주어진 문자열에서 구성할 수 있는 부분 문자열은 1, 10, 100, 1000, 10000, 010, 100001, 10001, 1001, 101, 11, 1000010입니다. 따라서 정확히 2개의 1개를 갖는 6개의 부분 문자열이 있습니다.

입력 - 문자열 str ='10000100000', k =3

출력 − K개를 포함하는 이진 문자열의 부분 문자열 수는 − 0

설명 − k의 정수 값이 3으로 주어지며 이진수가 포함된 문자열을 확인하면 2개만 있습니다. 따라서 하위 문자열에 k개의 1이 주어질 가능성은 없습니다.

아래 프로그램에서 사용한 접근 방식은 다음과 같습니다.

  • 0과 1의 조합과 정수 변수 k를 갖는 이진수 문자열을 입력하십시오.

  • length() 함수를 사용하여 문자열의 길이를 계산하고 추가 처리를 위해 데이터를 함수에 전달합니다.

  • k개의 하위 문자열을 저장하기 위해 임시 변수 count 및 total을 0으로 선언합니다.

  • 크기의 1의 빈도를 string의 길이에 1을 더한 값으로 저장하는 배열을 선언하고 0으로 초기화하고 배열의 첫 번째 요소를 1로 설정합니다.

  • 0부터 배열 길이까지 FOR 루프 시작

  • 루프 내에서 total을 total + str[i] - '0'으로 설정합니다. IF total>=k를 확인한 다음 count를 count + arr[total-k]로 설정합니다.

  • 반품 횟수

  • 결과를 인쇄하십시오.

예시

#include <bits/stdc++.h>
using namespace std;
int sub_k_ones(string str, int length, int k){
   int count = 0;
   int total_1 = 0;
   int arr_fre[length + 1] = {0};
   arr_fre[0] = 1;
   for (int i = 0; i < length; i++){
      total_1 = total_1 + (str[i] - '0');
      if (total_1 >= k){
         count = count + arr_fre[total_1 - k];
      }
      arr_fre[total_1]++;
   }
   return count;
}
int main(){
   string str = "10000100000";
   int length = str.length();
   int k = 2;
   cout<<"Count of substrings of a binary string containing K ones are: "<<sub_k_ones(str, length, k) << endl;
   return 0;
}

출력

위의 코드를 실행하면 다음 출력이 생성됩니다 -

Count of substrings of a binary string containing K ones are: 6