मान लीजिए हमारे पास डेटा का प्रतिनिधित्व करने वाली पूर्णांकों की एक सूची है। हमें जांचना है कि यह वैध UTF-8 एन्कोडिंग है या नहीं। एक UTF-8 वर्ण 1 से 4-बाइट लंबा हो सकता है। कुछ गुण हैं:
- 1-बाइट वर्ण के लिए, पहला बिट 0 होता है, उसके बाद इसका यूनिकोड कोड होता है।
- n-बाइट वर्ण के लिए, पहले n-बिट्स सभी 1 होते हैं, 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 का प्रतिनिधित्व करता है, इसलिए यह true लौटाएगा। यह 2-बाइट वर्ण के बाद 1-बाइट वर्ण के लिए एक वैध utf-8 एन्कोडिंग है।
इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे:
cnt := 0iको 0 से डेटा सरणी के आकार तक लूप करेंx := data[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हो तो सही लौटाएं
उदाहरण (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