একটি পূর্ণসংখ্যা লিস্ট দেওয়া আছে যা ডেটা রিপ্রেজেন্ট করে। এটি বৈধ UTF-8 এনকোডিং কিনা তা চেক করতে হবে। একটি UTF-8 ক্যারেক্টার ১ থেকে ৪ বাইট লম্বা হতে পারে। কিছু বৈশিষ্ট্য:
- ১-বাইট ক্যারেক্টারের জন্য, প্রথম বিট ০, তারপর ইউনিকোড কোড।
n-বাইট ক্যারেক্টারের জন্য, প্রথমnবিট সব ১,n+1বিট ০, তারপরn-1বাইট যাদের সবচেয়ে গুরুত্বপূর্ণ ২ বিট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, তাই এটি true ফেরত দেবে। এটি ২-বাইট ক্যারেক্টারের পর ১-বাইট ক্যারেক্টারের জন্য বৈধ UTF-8।
সমাধানের ধাপগুলো:
cnt := 0i = 0থেকেdata.size()-1পর্যন্ত:x := data[i]- যদি
cnt == 0:- যদি
x>>5 == 0b110,cnt = 1 - অন্যথায় যদি
x>>4 == 0b1110,cnt = 2 - অন্যথায় যদি
x>>3 == 0b11110,cnt = 3 - অন্যথায় যদি
x>>7 != 0,falseফেরত দিন
- যদি
- অন্যথায় যদি
x>>6 != 0b10,falseফেরত দিন এবংcnt--
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