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

การเข้ารหัสคำสั้น ๆ ใน C ++


สมมติว่าเรามีรายการคำ เราอาจเข้ารหัสโดยการเขียนสตริงอ้างอิง S และรายการดัชนี A ตัวอย่างเช่น ให้เราพิจารณาว่ารายการคำคือ ["เวลา" "ฉัน" "กระดิ่ง" หรือไม่ ] จากนั้นเราสามารถเขียนเป็น S ="time#bell#" และ indexes =[0, 2, 5] ที่นี่สำหรับแต่ละดัชนี เราจะกู้คืนคำโดยการอ่านจากสตริงอ้างอิงจากดัชนีนั้นจนกว่าจะถึงสัญลักษณ์ "#"

ดังนั้นเราต้องหาความยาวของสตริงอ้างอิงที่สั้นที่สุด S ที่เป็นไปได้ที่เข้ารหัสคำที่กำหนด? สำหรับตัวอย่างที่กำหนด ผลลัพธ์จะเป็น 10

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

  • กำหนดเมธอด insertNode ซึ่งจะใช้ส่วนหัวและสตริง s
  • curr :=head, flag :=false.
  • สำหรับ i ในช่วงขนาด s – 1 เหลือ 0
    • x :=s[i]
    • ถ้า m[x] ของ curr เป็นโมฆะ ให้ตั้งค่า flat :=true และสร้างโหนดใหม่เป็น m[x] ของ curr
    • curr :=m[x] ของสกุลเงิน
  • ขนาดส่งคืนของ s เมื่อแฟล็กเป็นจริง มิฉะนั้น 0
  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −
  • ret :=0, head :=โหนดใหม่
  • จัดเรียงอาร์เรย์คำตามความยาว
  • n :=ขนาดของคำ
  • สำหรับ i ในช่วง 0 ถึง n – 1
    • temp :=insertNode(head, words[i])
    • ถ้า temp ไม่ใช่ 0 แล้ว ret :=ret + temp + 1
  • คืนสินค้า

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

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
struct Node{
   map <char, Node*> m;
};
class Solution {
   public:
   static bool cmp(string a, string b){
      return a.size() > b.size();
   }
   int insertNode(Node* head, string s){
      Node* curr = head;
      bool flag = false;
      for(int i = s.size() - 1; i >= 0; i--){
         char x = s[i];
         if(!curr->m[x]){
            flag = true;
            curr->m[x] = new Node();
         }
         curr = curr->m[x];
      }
      return flag? (int)s.size() : 0;
   }
   int minimumLengthEncoding(vector<string>& words) {
      int ret = 0;
      Node* head = new Node();
      sort(words.begin(), words.end(), cmp);
      int n = words.size();
      for(int i = 0; i < n; i++){
         int temp= insertNode(head, words[i]);
         if(temp){
            ret += (temp + 1);
         }
      }
      return ret;
   }
};
main(){
   vector<string> v = {"time", "me", "bell"};
   Solution ob;
   cout << (ob.minimumLengthEncoding(v));
}

อินพุต

["time", "me", "bell"]

ผลลัพธ์

10