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

ลำดับหน้าต่างขั้นต่ำใน C ++


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