ภารกิจคือการค้นหาจำนวนสูงสุดของตัวอักษรตัวพิมพ์เล็กที่แตกต่างกันซึ่งอยู่ระหว่างตัวอักษรตัวพิมพ์ใหญ่สองตัวในสตริงที่กำหนด
ตอนนี้มาทำความเข้าใจสิ่งที่เราต้องทำโดยใช้ตัวอย่าง -
อินพุต
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