สมมติว่าเรามีสตริงย่อย S และ T สองสตริง เราต้องหาสตริงย่อยขั้นต่ำ W ของ S เพื่อให้ T เป็นผลสืบเนื่องของ W หากไม่มีหน้าต่างดังกล่าวใน S ที่ครอบคลุมอักขระทั้งหมดใน T ให้ส่งคืนสตริงว่าง หากมีหลายหน้าต่างดังกล่าว เราต้องคืนค่าหน้าต่างที่มีดัชนีเริ่มต้นด้านซ้ายสุด
ดังนั้น หากอินพุตเป็น S ="abcdebdde", T ="bde" เอาต์พุตจะเป็น "bcde" เนื่องจากเกิดขึ้นก่อน "bdde" "deb" ไม่ใช่หน้าต่างที่เล็กกว่าเพราะองค์ประกอบของ T ในหน้าต่างต้องเกิดขึ้นตามลำดับ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
tidx :=0, tlen :=ขนาดของ T
-
n :=ขนาด S
-
i :=0, length :=inf, start :=-1
-
ในขณะที่ฉัน
-
ถ้า S[i] เหมือนกับ T[tidx] แล้ว −
-
(เพิ่ม tidx ขึ้น 1)
-
ถ้า tidx เหมือนกับ tlen แล้ว −
-
จบ :=ผม + 1
-
(ลด tidx ลง 1)
-
ในขณะที่ tidx>=0, ทำ −
-
ถ้า S[i] เหมือนกับ T[tidx] แล้ว −
-
(ลด tidx ลง 1)
-
-
(ลดลง 1)
-
-
(เพิ่ม i ขึ้น 1)
-
(เพิ่ม tidx ขึ้น 1)
-
ถ้าสิ้นสุด - i <ความยาว แล้ว −
-
length :=end - i
-
เริ่ม :=ฉัน
-
-
-
-
(เพิ่ม i ขึ้น 1)
-
-
หากการเริ่มต้นไม่เท่ากับ -1 แล้ว −
-
สำหรับการเริ่มต้น i :=start เมื่อฉัน
-
ret :=ret + S[i]
-
-
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string minWindow(string S, string T) {
int tidx = 0;
int tlen = T.size();
int n = S.size();
int i = 0;
int length = INT_MAX;
int start = -1;
string ret;
while (i < n) {
if (S[i] == T[tidx]) {
tidx++;
if (tidx == tlen) {
int end = i + 1;
tidx--;
while (tidx >= 0) {
if (S[i] == T[tidx]) {
tidx--;
}
i--;
}
i++;
tidx++;
if (end - i < length) {
length = end - i;
start = i;
}
}
}
i++;
}
if (start != -1)
for (int i = start; i < start + length; i++)
ret += S[i];
return ret;
}
};
main(){
Solution ob;
cout << (ob.minWindow("abcdebdde", "bde"));
} อินพุต
"abcdebdde", "bde"
ผลลัพธ์
"bcde"