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

ตรวจสอบว่าสตริงมีรหัสไบนารีขนาด K ครบทุกแบบใน C++


สมมติว่าเรามีสตริงไบนารี s และจำนวนเต็ม k เราต้องตรวจสอบว่ารหัสไบนารีความยาว k ทุกแบบเป็น substring ของ s หรือไม่

ตัวอย่าง: S = "00110110", k = 2 ผลลัพธ์ = true รหัสความยาว 2 คือ "00", "01", "10", "11" อยู่ที่ index 0,1,3,2 ตามลำดับ

วิธีแก้ปัญหา (Sliding Window + Hash Set)

  1. ใช้ sliding window ขนาด k เดินผ่าน s
  2. เก็บ substring ที่เจอใน hash set
  3. ถ้าจำนวนใน set เท่ากับ 2^k คืน true ทันที
  4. จบลูปไม่ครบคืน false

ตัวอย่างโค้ด C++

#include <bits/stdc++.h> 
using namespace std; 

typedef long long int lli; 

class Solution { 
public: 
    lli fastPow(lli b, lli p){ 
        lli ret = 1; 
        while (p) { 
            if (p & 1) ret *= b; 
            b *= b; 
            p >>= 1; 
        } 
        return ret; 
    } 
    
    bool hasAllCodes(string s, int k) { 
        unordered_set<string> v; 
        string temp = ""; 
        lli req = fastPow(2, k); 
        for (lli i = 0; i < s.size(); i++) { 
            temp += s[i]; 
            if (i >= k) temp.erase(0, 1); 
            if (i >= k - 1) v.insert(temp); 
            if ((lli)v.size() == req) return true; 
        } 
        return false; 
    } 
}; 

int main(){ 
    Solution ob; 
    cout << (ob.hasAllCodes("00110110",2)); 
}

ข้อมูลนำเข้า

"00110110",2

ผลลัพธ์

1