Leetcode 393 UTF-8 Validation

关于utf-8编码,题目中已经有介绍。 第一位是0的字节,是单字节字符。 第一位是1,第二位是0的,不是。

前两位是1,第三位是0,接下来一字节前两位是10的是双字节字符。

前三位是1,第四位是0,接下来两字节前两位是10的是三字节字符。

前四位是1,第五位是0,接下来三字节前两位是10的是四字节字符。

其余不是。

知道了utf-8编码规则,就容易了。这道题的输入是一个int型的数组,每个数的后8位是有效的数据,表示一个字节。输出是bool型变量,表示输入的数据是否是有效的utf-8编码,注意两个合理的utf-8字符,也算有效的utf-8编码。

解法框架就是一个大循环,遍历每位数字,是utf-8字符的一部分就下一字符,不是就返回false,所有都有效,最后一个字符也完整,就返回true,思路清晰明了。

static int x = [] () {ios::sync_with_stdio(false); cin.tie(0); return 0;} ();
class Solution {
 public:
  bool validUtf8(vector<int>& data) {
    int left = 0;
    for (int i: data) {
      if (left == 0) {
        if ((i>>7) == 0) continue;
        if ((i>>5) == 0b110) left = 1;
        else if ((i>>4) == 0b1110) left = 2;
        else if ((i>>3) == 0b11110) left = 3;
        else return false;
      } else {
        if ((i>>6) != 0b10) return false;
        --left;
      }
    }
    return left == 0;
  }
};

#直达链接

LeetCode 393. UTF-8 Validation