কম্পিউটার

C++ এ শব্দের সংক্ষিপ্ত এনকোডিং


ধরুন আমাদের কাছে শব্দের একটি তালিকা আছে, আমরা একটি রেফারেন্স স্ট্রিং S এবং সূচী A-এর একটি তালিকা লিখে এটিকে এনকোড করতে পারি। সুতরাং উদাহরণ স্বরূপ, আসুন বিবেচনা করা যাক শব্দের তালিকা ["সময়", "me", "bell" ], তাহলে আমরা এটিকে S ="time#bell#" এবং সূচক =[0, 2, 5] হিসাবে লিখতে পারি। এখানে প্রতিটি সূচকের জন্য, আমরা "#" চিহ্নে না পৌঁছানো পর্যন্ত সেই সূচকের রেফারেন্স স্ট্রিং থেকে পড়ে শব্দটি পুনরুদ্ধার করব।

সুতরাং আমাদের খুঁজে বের করতে হবে যে প্রদত্ত শব্দগুলিকে এনকোড করে এমন সংক্ষিপ্ততম রেফারেন্স স্ট্রিং S এর দৈর্ঘ্য কত? সুতরাং প্রদত্ত উদাহরণের জন্য, আউটপুট হবে 10।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • insertNode পদ্ধতি সংজ্ঞায়িত করুন, এটি হেড এবং স্ট্রিং s লাগবে
  • curr :=মাথা, পতাকা :=মিথ্যা।
  • এর জন্য s-এর রেঞ্জ সাইজ 1 থেকে 0
    • x :=s[i]
    • যদি curr-এর m[x] শূন্য হয়, তাহলে ফ্ল্যাট সেট করুন :=true এবং curr-এর m[x]-এ একটি নতুন নোড তৈরি করুন।
    • curr :=curr এর m[x]
  • পতাকা সত্য হলে s এর আকার ফেরত দিন, অন্যথায় 0
  • প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
  • ret :=0, head :=নতুন নোড
  • শব্দের দৈর্ঘ্যের উপর ভিত্তি করে অ্যারে সাজান
  • n :=শব্দের আকার
  • আমি 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

  1. C++ এ বাইনারি ট্রির সংক্ষিপ্ত এনকোডিং

  2. C++ এ তারকাচিহ্ন দিয়ে শব্দ প্রতিস্থাপন করা হচ্ছে

  3. একটি ফাইলে অনন্য শব্দ প্রিন্ট করার জন্য C++ প্রোগ্রাম

  4. কিভাবে C++ এ একটি সংক্ষিপ্ত আক্ষরিক লিখবেন?