สมมติว่าเรามีข้อความสตริง ดังนั้นเราจึงสามารถสลับอักขระสองตัวในสตริงได้ เราต้องหาความยาวของสตริงย่อยที่ยาวที่สุดด้วยอักขระที่ซ้ำกัน ดังนั้นหากอินพุตเป็นเหมือน "ababa" ผลลัพธ์จะเป็น 3 ราวกับว่าเราสลับ b ตัวแรกกับ a สุดท้าย หรือ b สุดท้ายกับ a ตัวแรก จากนั้นอักขระที่ทำซ้ำที่ยาวที่สุดจะเป็น "aaa" ดังนั้นความยาวจึงเท่ากับ 3.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดแผนที่ cnt ตั้งค่า ret :=1 j :=0, n :=ขนาดของข้อความ v :=0 กำหนดชุดที่เรียกว่า x และสร้างแผนที่อื่นที่เรียกว่า m m จะเก็บความถี่ของอักขระแต่ละตัว ในข้อความ
-
ตั้งค่า a :=* และ b :=*
-
สำหรับฉันอยู่ในช่วง 0 ถึง n
-
เพิ่ม cnt[text[i]] ขึ้น 1
-
แทรกข้อความ[i] ลงใน x
-
ถ้า cnt[text[i]] เป็น 2 แล้ว
-
ถ้า a คือ * แล้ว a :=text[i] หรือ b :=text[i]
-
-
ถ้า a ไม่ใช่ * และ b ไม่ใช่ * หรือขนาดของ x มากกว่า 2
-
ลด cnt[text[j]] ลง 1
-
ถ้า cnt[text[j]] คือ 1 แล้ว
-
ถ้า text[j] เป็น a ให้ตั้งค่า a :=* มิฉะนั้น b :=*
-
-
-
ถ้า cnt[text[j]] เป็น 0 ให้ลบ text[j] ออกจาก x
-
มากกว่า :=a if cnt[a]> cnt[b] มิฉะนั้น b
-
ถ้าขนาดของ x เป็น 1 หรือ m[มากกว่า] – cnt[ยิ่งใหญ่] ไม่ใช่ 0 ดังนั้น
-
ret :=สูงสุดของ ret, i – j + 1
-
-
มิฉะนั้น ret :=สูงสุดของ ret, i – j
-
-
รีเทิร์น.
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int maxRepOpt1(string text) { int ret = 1; map <char, int> cnt; int j = 0; int n = text.size(); int v = 0; set <char> x; map <char, int> m; for(int i = 0; i < text.size(); i++)m[text[i]]++; char a = '*', b ='*'; for(int i = 0; i < n; i++){ cnt[text[i]]++; x.insert(text[i]); if(cnt[text[i]] == 2){ if(a == '*'){ a = text[i]; }else{ b = text[i]; } } while(a != '*' && b != '*' || x.size() > 2){ cnt[text[j]]--; if(cnt[text[j]] == 1) { if(text[j] == a) { a ='*'; }else{ b = '*'; } } if(cnt[text[j]] == 0) x.erase(text[j]); j++; } char greater = cnt[a] > cnt[b] ? a : b; if(x.size() == 1 || m[greater] - cnt[greater]){ ret = max(ret, i - j + 1); }else{ ret = max(ret, i - j); } } return ret; } }; main(){ Solution ob; cout << (ob.maxRepOpt1("ababa")); }
อินพุต
"ababa"
ผลลัพธ์
3