กำหนดภารกิจคือค้นหาจำนวนสูงสุดของสตริงย่อยของความยาว K ประกอบด้วยตัวอักษรเดียวกัน กำหนดสตริง s และจำนวนเต็มอื่น K เราต้องนับการเกิดของสตริงย่อยที่มีขนาด K ที่มีตัวอักษรเหมือนกัน
จากสตริงย่อยที่พบ เราต้องเลือกสตริงย่อยที่เกิดจำนวนครั้งสูงสุด
ตอนนี้มาทำความเข้าใจสิ่งที่เราต้องทำโดยใช้ตัวอย่าง -
อินพุต
s = ”tuuxyyuuc”, K = 2
ผลลัพธ์
2
คำอธิบาย
สตริงย่อยที่มีความยาว 2 และมีอักขระเหมือนกันคือ "uu" และ "yy" แต่จะเห็นได้ว่า "yy" เกิดขึ้นเพียง 1 ครั้งและ "uu" มี 2 ครั้ง ดังนั้นผลลัพธ์จะกลายเป็น 2
อินพุต
s = “hhigggff”, K = 3
ผลลัพธ์
1
แนวทางที่ใช้ในโปรแกรมด้านล่างดังนี้
-
ในฟังก์ชัน Max() ให้เริ่มต้น int ans =0 เพื่อเก็บคำตอบสุดท้าย size =str.size() เพื่อเก็บขนาดของสตริงและประกาศ char c เพื่อเก็บอักขระที่เราต้องตรวจสอบ
-
วนจาก j =0 ถึง j <26 และใส่ c ='a' + j ตามที่เราจะตรวจสอบอักขระแต่ละตัว
-
เริ่มต้นตัวแปร int CurrCh =0 เพื่อจัดเก็บการเกิดขึ้นของอาร์เรย์ย่อยที่มีอักขระปัจจุบัน
-
วนจาก i =0 ถึง i <=size – K และตรวจสอบว่า (str[i] !=c) ถ้าเป็นเช่นนั้น ให้เพิ่ม ทำต่อ; คำสั่ง
-
เริ่มต้นการนับ =0 เพื่อเก็บความยาวของอาร์เรย์ย่อยของอักขระปัจจุบัน
-
สร้างการวนซ้ำแบบมีเงื่อนไข (i
นับ . นอก while loop ลดลง 1 -
ตรวจสอบว่า (นับ ==K) ถ้าเป็นเช่นนั้น ให้เพิ่ม CurrCh .
-
ปิดที่สอง For loop และอัปเดตค่าของ ans โดยใส่ ans =max(ans, CurrCh)
-
สุดท้ายปิด For loop แรกแล้วกลับ ans .
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int Max(string str, int K){ int ans = 0, size = str.size(); char c; //Checking for all characters for (int j = 0; j < 26; j++){ c = 'a' + j; //checking for current character int CurrCh = 0; for (int i = 0; i <= size - K; i++){ if (str[i] != c) continue; //Counting the size of sub-string int count = 0; while (i < size && count != K && str[i] == c){ i++; count++; } i--; //Increment CurrCh if sub-string has length K if (count == K) CurrCh++; } //Update ans ans = max(ans, CurrCh); } return ans; } //main function int main(){ string str = "tuuuxyuuu"; int K = 3; cout << Max(str, K); return 0; }
ผลลัพธ์
2