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<ขนาด และตรวจสอบว่า (s[i]>='A' &&s[i] <='Z') ถ้าเป็นเช่นนั้น ให้เพิ่ม ฉัน และแตก;

  • เริ่มต้น int แทน =0 เพื่อเก็บคำตอบสุดท้ายและอาร์เรย์อื่น cnt[26] ={0}.

  • วนจาก i =0 ถึง i='A' &&s[i] <='Z') เพื่อตรวจสอบว่าตัวอักษรปัจจุบันเป็นตัวพิมพ์ใหญ่หรือไม่ ถ้าเป็นเช่นนั้น ให้เริ่มต้น int CurrMax =0 เพื่อเก็บค่าสูงสุดในปัจจุบัน

  • วนจาก i =0 ถึง i<26 และตรวจสอบว่า (cnt[i]> 0) หากเป็นเช่นนั้น ให้เพิ่ม CurrMax

  • นอก for loop ให้อัปเดต ตอบ โดยใส่ ans =max(ans, CurrMax); และรีเซ็ตอาร์เรย์ cnt[] โดยใช้ memset(cnt, 0, sizeof(cnt));

  • ปิดคำสั่ง if() ด้านบนและตรวจสอบว่า (s[i]>='a' &&s[i] <='z') ถ้าเป็นเช่นนั้น ให้เพิ่ม cnt[s[i] - 'a'].

  • ปิด for loop แล้วคืนค่า ans

ตัวอย่าง

#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