Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

จำนวนสูงสุดของสตริงย่อยใน C++


สมมติว่าเรามีสตริง 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