주어진 작업은 주어진 문자열에서 두 개의 대문자 사이에 존재하는 고유한 소문자 알파벳의 최대 수를 찾는 것입니다.
이제 예제를 사용하여 무엇을 해야 하는지 이해합시다 -
입력
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