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

สตริงย่อยที่ยาวที่สุดที่มีอักขระซ้ำอย่างน้อย K ใน C++


สมมติว่าเรามีสตริง s และเราต้องหาความยาวของสตริงย่อยที่ยาวที่สุด T ของสตริงที่กำหนดนั้น (ประกอบด้วยตัวพิมพ์เล็กเท่านั้น) เพื่อให้อักขระทุกตัวใน T ปรากฏอยู่ไม่น้อย มากกว่า k ครั้ง ดังนั้นหากสตริงคือ "ababbc" และ k =2 เอาต์พุตจะเป็น 3 และสตริงย่อยที่ยาวที่สุดจะเป็น "ababb" เนื่องจากมี 2 a และ 3 b

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • สร้างฟังก์ชันเรียกซ้ำที่เรียกว่า longestSubstring() ซึ่งใช้สตริง s และขนาด k
  • ถ้า k =1 ให้คืนค่าขนาดของสตริง
  • ถ้าขนาดของสตริง
  • สร้างหนึ่งอาร์เรย์ c ขนาด 26 และเติมด้วย -1
  • n :=ขนาดของสตริง
  • สำหรับฉันอยู่ในช่วง 0 ถึง n
    • ถ้า c[s[i] – 'a'] =-1 แล้ว c[s[i] – 'a'] :=1 มิฉะนั้น ให้เพิ่ม c[s[i] – 'a'] ขึ้น 1
  • badChar :=‘*’
  • สำหรับ i ในช่วง 0 ถึง 25
    • ถ้า c[i] ไม่ใช่ -1 และ c[i]
  • ถ้า badChar ='*' ให้คืนค่า n
  • v :=อาร์เรย์ของสตริงอื่นโดยแยกสตริงเดิมโดยใช้ badChar
  • แทน :=0
  • สำหรับ i ในช่วง 0 ถึงขนาดของ v
    • ans :=สูงสุดของ ans และ longestSubstring(v[i], k)
  • คืนสินค้า

ตัวอย่าง(C++)

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   vector <string> splitString(string s, char x){
      string temp = "";
      vector <string> res;
      for(int i = 0; i < s.size(); i++){
         if(s[i] == x){
            if(temp.size())res.push_back(temp);
            temp = "";
         }
         else temp += s[i];
      }
      if(temp.size())res.push_back(temp);
      return res;
   }
   int longestSubstring(string s, int k) {
      if(k == 1)return s.size();
      if(s.size() < k )return 0;
      vector <int> cnt(26, -1);
      int n = s.size();
      for(int i = 0; i < n; i++){
         if(cnt[s[i] - 'a'] == -1) cnt[s[i] - 'a'] = 1;
         else cnt[s[i] - 'a']++;
      }
      char badChar = '*';
      for(int i = 0; i < 26; i++){
         if(cnt[i] != -1 && cnt[i] < k){
            badChar = i + 'a';
            break;
         }
      }
      if(badChar == '*')return n;
      vector <string> xx = splitString(s, badChar);
      int ans = 0;
      for(int i = 0; i < xx.size(); i++)ans = max(ans, longestSubstring(xx[i], k));
      return ans;
   }
};
   main(){
   Solution ob;
   cout << ob.longestSubstring("ababbc", 2);
}

อินพุต

"ababbc"
2

ผลลัพธ์

5