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