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

C++에서 두 대문자 사이의 최대 고유 소문자 알파벳

<시간/>

주어진 작업은 주어진 문자열에서 두 개의 대문자 사이에 존재하는 고유한 소문자 알파벳의 최대 수를 찾는 것입니다.

이제 예제를 사용하여 무엇을 해야 하는지 이해합시다 -

입력

str = “JKyubDoorG”

출력

3

설명

"yub"는 두 개의 대문자 K와 D 사이에 있으므로 카운트가 3이 됩니다.

"oor"는 두 개의 대문자 D와 G 사이에도 존재하므로 2를 'o'가 반복되는 알파벳으로 만들고 우리는 별개의 알파벳을 찾고 있습니다.

따라서 출력은 3입니다.

입력

str = “ABcefsTaRpaep”

출력

4

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

  • Max() 함수에서 int 크기 초기화 =s.length() 주어진 문자열의 길이를 저장합니다.

  • i =0에서 i='A' &&s[i] <='Z')인지 확인합니다. 그렇다면 I를 증가시킵니다. 그리고 휴식;

  • 정수 ans 초기화 =0은 최종 답변과 다른 배열을 저장합니다. cnt[26] ={0}.

  • i =0에서 i='A' &&s[i] <='Z')를 확인하여 현재 알파벳이 대문자인지 확인합니다. 그렇다면 int CurrMax 초기화 =0 현재 최대값을 저장합니다.

  • i =0에서 i<26까지 반복하고 (cnt[i]> 0)인지 확인합니다. 그렇다면 CurrMax를 증가시키십시오.

  • for 루프 외부에서 ans 업데이트 ans =max(ans, CurrMax); memset(cnt, 0, sizeof(cnt));

    를 사용하여 cnt[] 배열을 재설정합니다.
  • 위의 if() 문을 닫고 if (s[i]>='a' &&s[i] <='z')를 확인합니다. 그렇다면 cnt[s[i] - 'a']를 증가시키십시오.

  • for 루프를 닫고 as를 반환합니다.

예시

#include <bits/stdc++.h>
using namespace std;
int Max(string s){
   int size = s.length();
   // Ignore the lowercase alphabets in beginning
   for (int i = 0; i < size; i++){
      if (s[i] >= 'A' && s[i] <= 'Z'){
         i++;
         break;
      }
   }
   int ans = 0;
   int cnt[26] = { 0 };
   for (int i = 0; i < size; i++) {
      // If alphabet is uppercase,
      if (s[i] >= 'A' && s[i] <= 'Z'){
         //Counting all lower case
         //distinct alphabets
         int CurrMax = 0;
         for (int i = 0; i < 26; i++){
            if (cnt[i] > 0)
               CurrMax++;
         }
         // Update ans
         ans = max(ans, CurrMax);
         // Reset count array
         memset(cnt, 0, sizeof(cnt));
      }
      // If alphabet is lowercase
      if (s[i] >= 'a' && s[i] <= 'z')
         cnt[s[i] - 'a']++;
   }
   return ans;
}
// Driver function
int main(){
   string str = "JKyubDoorG";
   cout << Max(str);
   return 0;
}

출력

3