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

รูปแบบคำ II ใน C++


สมมติว่าเรามีรูปแบบและสตริงที่เรียกว่า str เราต้องตรวจสอบว่า str มีรูปแบบเดียวกันหรือไม่ รูปแบบตามนี้หมายถึงการจับคู่แบบเต็มรูปแบบ โดยที่จะมีการ bijection ระหว่างตัวอักษรในรูปแบบและสตริงย่อยที่ไม่ว่างเปล่าใน str

ดังนั้น หากอินพุตเหมือนกับรูปแบบคือ "abaa" str คือ "orangegreenorangeorange" ผลลัพธ์จะเป็นจริง

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

  • กำหนดฟังก์ชัน Solve() ซึ่งจะใช้ i, j, ptr, s, map m ชุดหนึ่งเรียกว่าใช้แล้ว

  • ถ้า i>=ขนาดของ s และ j>=ขนาดของ ptr แล้ว −

    • คืนความจริง

  • ถ้า i>=ขนาดของ s หรือ j>=ขนาดของ ptr แล้ว −

    • คืนค่าเท็จ

  • ถ้า ptr[j] อยู่ในหน่วย m แล้ว −

    • ต้องการ :=m[ptr[j]]

    • len :=ขนาดของความต้องการ

    • ถ้า len> ขนาดของ s แล้ว −

      • คืนค่าเท็จ

    • หากสตริงย่อยของ s จากดัชนี (i ถึง len-1) เหมือนกับ req และแก้ปัญหา (i + len, j + 1, ptr, s, m, ใช้แล้ว) −

      • คืนความจริง

    • คืนค่าเท็จ

  • มิฉะนั้น

    • x :=ptr[j]

    • สำหรับการเริ่มต้น k :=i เมื่อ k

      • temp :=สตริงย่อยของ s จากดัชนี (i ถึง k - i)

      • หากมีการใช้อุณหภูมิ −

        • ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป

      • m[x] :=อุณหภูมิ

      • ใส่อุณหภูมิในการใช้งาน

      • ถ้าแก้ (k + 1, j + 1, ptr, s, m, ใช้แล้ว) −

        • คืนความจริง

      • ลบ x จาก m

      • ลบอุณหภูมิที่ใช้

  • คืนค่าเท็จ

  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −

  • กำหนดหนึ่งแผนที่ m

  • กำหนดหนึ่งชุดที่ใช้

  • คืนค่าแก้(0, 0, ptr, s, m, ใช้แล้ว)

ตัวอย่าง

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool solve(int i, int j, string ptr, string s, map <char, string>& m, set<string>& used){
      if (i >= s.size() && j >= ptr.size()) {
         return true;
      }
      if (i >= s.size() || j >= ptr.size())
         return false;
      if (m.count(ptr[j])) {
         string req = m[ptr[j]];
         int len = req.size();
         if (len > s.size() - i)
            return false;
         if ((s.substr(i, len) == req) && solve(i + len, j + 1, ptr, s, m, used))
            return true;
         return false;
      }
      else {
         char x = ptr[j];
         for (int k = i; k < s.size(); k++) {
            string temp = s.substr(i, k - i + 1);
            ;
            if (used.count(temp))
               continue;
            m[x] = temp;
            used.insert(temp);
            if (solve(k + 1, j + 1, ptr, s, m, used))
               return true;
            m.erase(x);
            used.erase(temp);
         }
      }
      return false;
   }
   bool wordPatternMatch(string ptr, string s) {
      map<char, string> m;
      set<string> used;
      return solve(0, 0, ptr, s, m, used);
   }
};
main(){
   Solution ob;
   cout << (ob.wordPatternMatch("abaa", "orangegreenorangeorange"));
}

อินพุต

"abaa" "orangegreenorangeorange"

ผลลัพธ์

1