ধরুন আমাদের কাছে ডেটা প্রতিনিধিত্বকারী একটি তালিকা পূর্ণসংখ্যা রয়েছে। এটি বৈধ UTF-8 এনকোডিং কিনা তা আমাদের পরীক্ষা করতে হবে। একটি UTF-8 অক্ষর 1 থেকে 4-বাইট দীর্ঘ হতে পারে। কিছু বৈশিষ্ট্য আছে -
-
1-বাইট অক্ষরের জন্য, প্রথম বিটটি একটি 0, তার পরে এটির ইউনিকোড কোড৷
-
n-বাইট অক্ষরের জন্য, প্রথম n-বিটগুলি হল 1s, n+1 বিট হল 0, তারপরে n-1 বাইট এবং সর্বাধিক উল্লেখযোগ্য 2 বিট হল 10৷
সুতরাং এনকোডিং কৌশলটি নিম্নরূপ -
অক্ষর সংখ্যা পরিসর | UTF-8 অক্টেট সিকোয়েন্স |
0000 0000 0000 007F | 0xxxxxxx |
0000 0080 0000 07FF | 110xxxxx 10xxxxxx |
0000 0800 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
সুতরাং যদি ইনপুটটি [197, 130, 1] এর মত হয়, তাহলে এটি অক্টেট সিকোয়েন্স 11000101 10000010 00000001 প্রতিনিধিত্ব করে, তাই এটি সত্য হবে। এটি একটি 2-বাইট অক্ষরের জন্য একটি বৈধ utf-8 এনকোডিং এবং তারপরে 1-বাইট অক্ষর৷
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
cnt :=0
-
আমি 0 থেকে ডাটা অ্যারের আকারের মধ্যে
-
x :=ডেটা[i]
-
যদি cnt 0 হয়, তাহলে
-
যদি x/32 =110, তাহলে cnt কে 1
হিসেবে সেট করুন -
অন্যথায় যখন x/16 =1110, তারপর cnt =2
-
অন্যথায় যখন x/8 =11110, তারপর cnt =3
-
অন্যথায় যখন x/128 0 হয়, তখন মিথ্যা ফেরত দিন
-
-
অন্যথায় যখন x /64 10 না হয়, তখন মিথ্যা দিন এবং cnt কমিয়ে 1
করুন
-
-
cnt 0
হলে true রিটার্ন করুন
উদাহরণ(C++)
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h> using namespace std; class Solution { public: bool validUtf8(vector<int>& data) { int cnt = 0; for(int i = 0; i <data.size(); i++){ int x = data[i]; if(!cnt){ if((x >> 5) == 0b110){ cnt = 1; } else if((x >> 4) == 0b1110){ cnt = 2; } else if((x >> 3) == 0b11110){ cnt = 3; } else if((x >> 7) != 0) return false; } else { if((x >> 6) != 0b10) return false; cnt--; } } return cnt == 0; } }; main(){ Solution ob; vector<int> v = {197,130,1}; cout << (ob.validUtf8(v)); }
ইনপুট
[197,130,1]
আউটপুট
1