ধরুন আমাদের কাছে ডেটা প্রতিনিধিত্বকারী একটি তালিকা পূর্ণসংখ্যা রয়েছে। এটি বৈধ 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