ภารกิจคือการหาจำนวนสูงสุดของตัวอักษรพิมพ์เล็กที่แตกต่างกัน (distinct lowercase alphabets) ที่อยู่ระหว่างตัวอักษรพิมพ์ใหญ่ 2 ตัวในสตริงที่กำหนด
ตัวอย่าง
อินพุต
str = "JKyubDoorG"
เอาต์พุต
3
คำอธิบาย
"yub" อยู่ระหว่างตัวพิมพ์ใหญ่ K และ D ทำให้ได้ 3 ตัว
"oor" อยู่ระหว่าง D และ G ได้ 2 ตัว เพราะ 'o' ซ้ำกัน และเราหาตัวที่แตกต่างกัน
ดังนั้น ผลลัพธ์คือ 3
อินพุต
str = "ABcefsTaRpaep"
เอาต์พุต
4
แนวทางที่ใช้ในโปรแกรมด้านล่าง
- ในฟังก์ชัน Max() เริ่มต้น int size = s.length() เก็บความยาวสตริง
- ลูป i = 0 ถึง i < size ตรวจสอบ if (s[i] >= 'A' && s[i] <= 'Z') ถ้าใช่ i++ และ break (ข้ามตัวพิมพ์เล็กนำหน้า)
- เริ่มต้น int ans = 0 เก็บคำตอบ และอาร์เรย์ cnt[26] = {0}
- ลูป i = 0 ถึง i < size ตรวจสอบ if (s[i] >= 'A' && s[i] <= 'Z') ถ้าเป็นตัวพิมพ์ใหญ่ เริ่มต้น int CurrMax = 0
- ลูป i = 0 ถึง i < 26 ตรวจสอบ if (cnt[i] > 0) ถ้าใช่ CurrMax++
- นอกลูป อัปเดต ans = max(ans, CurrMax) และ reset cnt[] ด้วย memset(cnt, 0, sizeof(cnt))
- ปิด if ตัวพิมพ์ใหญ่ ตรวจสอบ if (s[i] >= 'a' && s[i] <= 'z') ถ้าใช่ cnt[s[i] - 'a']++
- ปิดลูป คืนค่า ans
ตัวอย่างโปรแกรม
#include <bits/stdc++.h>
using namespace std;
int Max(string s) {
int size = s.length();
// ข้ามตัวพิมพ์เล็กนำหน้า
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 (s[i] >= 'A' && s[i] <= 'Z') {
// นับตัวพิมพ์เล็กที่แตกต่างกัน
int CurrMax = 0;
for (int i = 0; i < 26; i++) {
if (cnt[i] > 0)
CurrMax++;
}
// อัปเดต ans
ans = max(ans, CurrMax);
// รีเซ็ตอาร์เรย์นับ
memset(cnt, 0, sizeof(cnt));
}
// ถ้าตัวอักษรเป็นพิมพ์เล็ก
if (s[i] >= 'a' && s[i] <= 'z')
cnt[s[i] - 'a']++;
}
return ans;
}
int main() {
string str = "JKyubDoorG";
cout << Max(str);
return 0;
}
เอาต์พุต
3