สมมติว่าเรามีสตริง s เราต้องหาจำนวนสูงสุดของสตริงย่อยที่เป็นไปตามกฎต่อไปนี้ -
- จำนวนอักขระที่ไม่ซ้ำในสตริงย่อยต้องน้อยกว่าหรือเท่ากับ maxLetters
- ขนาดสตริงย่อยต้องอยู่ในช่วง minSize และ maxSize รวมอยู่ด้วย
ดังนั้น หากอินพุตเป็น − “aababcaab”, maxLetters =2, minSize =3 และ maxSize =4 ผลลัพธ์จะเป็น 2 สตริงย่อย "aab" มี 2 รายการในสตริงดั้งเดิม ซึ่งเป็นไปตามเงื่อนไข ตัวอักษร 2 ตัวที่ไม่ซ้ำกันและขนาด 3 (ระหว่าง minSize และ maxSize)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดแผนที่ m
- สำหรับ sz ในช่วง minSize ถึง maxSize
- สร้างแผนที่ x สร้าง temp เริ่มแรกว่างเปล่า
- สำหรับฉันอยู่ในช่วง 0 ถึง sz – 1
- เพิ่ม x[s[i]] ขึ้น 1
- อุณหภูมิ :=อุณหภูมิ + s[i]
- สำหรับ j คือ 0, i ในช่วง sz ถึงขนาด s – 1 ให้เพิ่ม i และ j ขึ้น 1
- ถ้าขนาด x <=maxLetters ให้เพิ่ม m[temp] ขึ้น 1
- ลด x[temp[0]] ขึ้น 1
- ถ้า x[temp[0]] เป็น 0 ให้ลบ temp[0] ออกจาก x
- ลบองค์ประกอบ temp แรกและตัวที่สองออกจากตัว temp เอง
- เพิ่ม x[s[i]] ขึ้น 1
- อุณหภูมิ :=อุณหภูมิ + s[i]
- ถ้าขนาด x <=maxLetters ให้เพิ่ม m[temp] ขึ้น 1
- ตอบ :=0
- ในขณะที่ map m มีองค์ประกอบบางอย่างแล้ว
- ans :=สูงสุดของ ans และค่าของคู่คีย์-ค่า ith
- คืนสินค้า
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: int maxFreq(string s, int maxLetters, int minSize, int maxSize) { unordered_map <string ,int > m; for(int sz = minSize; sz <= minSize; sz++){ unordered_map <char, int> x; string temp =""; for(int i = 0; i < sz; i++){ x[s[i]]++; temp += s[i]; } for(int j = 0, i = sz; i < s.size(); i++, j++){ if(x.size() <= maxLetters){ m[temp]++; } x[temp[0]]--; if(x[temp[0]] == 0)x.erase(temp[0]); temp.erase(temp.begin(),temp.begin() + 1); x[s[i]]++; temp += s[i]; } if(x.size() <= maxLetters){ m[temp]++; } } int ans = 0; unordered_map <string ,int > :: iterator i = m.begin(); while(i != m.end()){ ans = max (ans, i->second); i++; } return ans; } }; main(){ Solution ob; cout << (ob.maxFreq("aababcaab",2,3,4)); }
อินพุต
"aababcaab" 2 3 4
ผลลัพธ์
2