মান করুন আমাদের একটি ওয়ার্ড লিস্ট দেওয়া আছে, আমরা এটিকে একটি রেফারেন্স স্ট্রিং S এবং একটি ইনডেক্স লিস্ট A লিখে এনকোড করতে পারি। উদাহরণস্বরূপ, যদি ওয়ার্ড লিস্ট হয় ["time", "me", "bell"], তবে আমরা এটিকে S = "time#bell#" এবং ইনডেক্স = [0, 2, 5] হিসেবে লিখতে পারি। এখানে প্রতিটি ইনডেক্সের জন্য, আমরা রেফারেন্স স্ট্রিং থেকে সেই ইনডেক্স থেকে পড়া শুরু করব "#" চিহ্ন পাওয়ার পর্যন্ত।
আমাদের বের করতে হবে দেওয়া ওয়ার্ডগুলো এনকোড করার জন্য সবচেয়ে ছোট রেফারেন্স স্ট্রিং S-এর দৈর্ঘ্য কত? দেওয়া উদাহরণের জন্য আউটপুট হবে ১০।
এটি সমাধান করার জন্য নিচের ধাপগুলি অনুসরণ করুন −
insertNodeমেথড সংজ্ঞায়িত করুন, এটিheadএবং স্ট্রিংsনেবেcurr := head,flag := falsei = s.size() - 1থেকে 0 পর্যন্তx := s[i]- যদি
curr->m[x]null হয়, তবেflag := trueসেট করুন এবং একটি নতুন নোড তৈরি করুনcurr->m[x]-এ curr := curr->m[x]
flagtrue হলেs.size()ফেরত দিন, অন্যথায় 0- মেইন মেথড থেকে নিচের কাজ করুন −
ret := 0,head := new nodewordsঅ্যারে দৈর্ঘ্য অনুযায়ী সর্ট করুনn := words-এর আকারi = 0থেকেn - 1পর্যন্তtemp := insertNode(head, words[i])- যদি
tempনন-জিরো হয়, তবেret := ret + temp + 1
retফেরত দিন
উদাহরণ কোড
#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