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

สตริงย่อยที่มีการต่อคำทุกคำใน C++


สมมติว่าเรามีสตริง s และเรายังมีรายการคำด้วย โดยคำที่อยู่ในอาร์เรย์จะมีความยาวเท่ากันทั้งหมด เราต้องหาดัชนีเริ่มต้นของสตริงย่อยใน s ซึ่งเป็นการต่อกันของแต่ละคำในคำเพียงครั้งเดียวและไม่มีอักขระแทรกแซง

ดังนั้นหากอินพุตเป็นเหมือน "barfoothefoobarman" และคำเป็น ["foo", "bar"] ผลลัพธ์จะเป็น [0,9] เนื่องจากสตริงย่อยที่เริ่มต้นที่ดัชนี 0 และ 9 คือ “barfoo” และ “foobar”

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดวิธีการที่เรียกว่า ok() ซึ่งจะใช้สตริง s, แมป wordCnt และ n -

  • ทำสำเนาของ s เป็น temp

  • สำหรับฉันอยู่ในช่วง n ถึงขนาดของ s – 1

    • ถ้าขนาดของอุณหภูมิหลายเท่าของ 0 แล้ว

      • หากเมื่อไม่มี temp ใน wordCnt ให้คืนค่าเท็จ

      • อย่างอื่น

        • ถ้า wordCnt[temp] เป็น 1 ให้ลบ temp ออกจาก wordCnt ให้ตั้งค่า temp เป็นสตริงว่าง

        • หรือลดค่าของ wordCnt[temp] ลง 1 ตั้งค่า temp เป็นสตริงว่าง

    • เพิ่มอุณหภูมิโดย s[i]

  • หาก temp ไม่ได้อยู่ใน wordCnt ให้คืนค่าเท็จ

  • อย่างอื่น

    • ถ้า wordCnt[temp] เป็น 1 ให้ลบ temp ออกจาก wordCnt ให้ตั้งค่า temp เป็นสตริงว่าง

    • หรือลดค่าของ wordCnt[temp] ลง 1 ตั้งค่า temp เป็นสตริงว่าง

  • คืนค่าจริงเมื่อขนาดของ wordCnt เป็น 0

  • จากวิธีหลัก ทำสิ่งนี้

  • ถ้าขนาดของ a เป็น 0 หรือขนาดของ b เป็น 0 ให้คืนค่าอาร์เรย์ว่าง

  • ทำแผนที่ wordCnt เก็บความถี่ของสตริงที่มีอยู่ใน b เป็น wordCnt

  • สร้างอาร์เรย์ที่เรียกว่า ans

  • window :=จำนวนคำ x จำนวนตัวอักษรในแต่ละคำ

  • สร้างสำเนาของสตริง a เป็น temp

  • สำหรับฉันในหน้าต่างช่วงขนาด – 1

    • ถ้าขนาด temp ถูกหารด้วยหน้าต่างและเรียก ok(temp, wordCnt, size of b[0]) แล้ว

      • ใส่ i – window เข้าไปใน ans

    • ใส่ a[i] ลงใน temp

    • ถ้าขนาดของ temp> window ให้ลบ substring จาก 0, 1

  • ถ้าขนาด temp ถูกหารด้วยหน้าต่างและเรียก ok(temp, wordCnt, size of b[0]) แล้ว

    • แทรกขนาดของหน้าต่าง a ลงใน ans

  • กลับมาอีกครั้ง

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   bool ok(string s, unordered_map <string, int> wordCnt, int n){
      string temp = "";
      for(int i = 0; i < n; i++){
         temp += s[i];
      }
      for(int i = n; i < s.size(); i++){
         if(temp.size() % n == 0){
            if(wordCnt.find(temp) == wordCnt.end())return false;
            else{
               if(wordCnt[temp] == 1){
                  wordCnt.erase(temp);
                  temp = "";
               }
               else{
                  wordCnt[temp]--;
                  temp = "";
               }
            }
         }
         temp += s[i];
      }
      if(wordCnt.find(temp) == wordCnt.end())return false;
      else{
         if(wordCnt[temp] == 1){
            wordCnt.erase(temp);
            temp = "";
         }
         else{
            wordCnt[temp]--;
            temp = "";
         }
      }
      return wordCnt.size() == 0;
   }
   vector<int> findSubstring(string a, vector<string> &b) {
      if(a.size() == 0 || b.size() == 0)return {};
      unordered_map <string, int> wordCnt;
      for(int i = 0; i < b.size(); i++)wordCnt[b[i]]++;
      vector <int> ans;
      int window = b.size() * b[0].size();
      string temp ="";
      for(int i = 0; i < window; i++)temp += a[i];
      for(int i = window; i < a.size(); i++){
         if(temp.size() % window == 0 && ok(temp, wordCnt, b[0].size())){
            ans.push_back(i - window);
         }
         temp += a[i];
         if(temp.size() > window)temp.erase(0, 1);
      }
      if(temp .size() % window ==0 && ok(temp, wordCnt, b[0].size()))ans.push_back(a.size() - window);
      return ans;
   }
};
main(){
   vector<string> v = {"foo", "bar"};
   Solution ob;
   print_vector(ob.findSubstring("barfoothefoobarman", v));
}

อินพุต

1,2,3,4,5,6,7
3

ผลลัพธ์

[0, 9, ]