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

จำนวนลำดับที่ตรงกันใน C++


สมมติว่าเรามีสตริง S และพจนานุกรมของคำ ค้นหาจำนวนคำ[i] ที่เป็นผลสืบเนื่องของ S ดังนั้นหากอินพุตคือ S=“abcde” และพจนานุกรมคือ [“a”, “bb” “acd”, “ace”] แล้วเอาท์พุตจะเป็น 3 เนื่องจากมีคำสามลำดับในพจนานุกรม ซึ่งเป็นลำดับรองของ S:“a” “acd” และ “ace”

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

  • n :=ขนาดของอาร์เรย์คำ
  • สร้างหนึ่งแผนที่ m
  • สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของคำ
    • แทรกคำ[i] ลงในแผนที่ m[words[i, 0]] ตำแหน่ง
  • ตอบ :=0
  • สำหรับ i ในช่วง 0 ถึงขนาด S
    • ถ่าน x :=S[i]
    • ถ้ามี x ในแผนที่ m แล้ว
      • อุณหภูมิ :=m[x] และลบ m[x]
      • สำหรับ j ในช่วง 0 ถึงขนาดอุณหภูมิ
        • ถ้าขนาดของ temp[j] =1 ให้เพิ่ม ans ขึ้น 1 มิฉะนั้น ให้แทรกสตริงย่อยของ temp[j] จากดัชนี 1 ลงใน m[temp[j, 1]]
  • คืนสินค้า

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

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int numMatchingSubseq(string S, vector<string>& words) {
      int n = words.size();
      map <char, vector <string> > m;
      for(int i = 0; i < words.size(); i++){
         m[words[i][0]].push_back(words[i]);
      }
      int ans = 0;
      for(int i = 0; i < S.size(); i++){
         char x = S[i];
         if(m.find(x) != m.end()){
            vector <string> temp = m[x];
            m.erase(x);
            for(int j = 0; j < temp.size(); j++){
               if(temp[j].size() == 1){
                  ans++;
               } else {
                  m[temp[j][1]].push_back(temp[j].substr(1));
               }
            }
         }
      }
      return ans;
   }
};
int main() {
   Solution ob1;
   string s = "abcde";
   vector<string> v{"a","bb","acd","ace"};
   cout << ob1.numMatchingSubseq(s, v) << endl;
   return 0;
}

อินพุต

"abcde"
["a","bb","acd","ace"]
string s = "abcde";
vector<string> v{"a","bb","acd","ace"};

ผลลัพธ์

3