位运算解决「伪回文」问题

位运算快速判断伪回文

伪回文

概念参考1457. 二叉树中的伪回文路径

[2,3,3][2,1,1]都为伪回文序列

[2,3,3]为例子,打破顺序后 有3-2-3为回文序列

如何快速判断?

位运算

异或

两大性质:(假定x为正整数)

1、0^x = x

2、x^x = 0

x & (x - 1)可以去除x最后一个1(当然是二进制下

例如:x = 1 010 100

x - 1 = 1 010 011则 x&(x - 1) = 1 010 000

显然去除了最后一个1


例子

1457. 二叉树中的伪回文路径为例子,每一个数值限定0~9,则将每一个数用对应的位数表示

1 << x;

1–>10

2–>100

3–>1 000

4–>10 000

9–>1 000 000 000

则回文序列

case1: 5-4-3-4-5奇数个

x ^= 1 << root->val;

利用 异或的两条性质

最后得到唯一落单的3,也即1000

再通过x & (x - 1)去除最后一个也是唯一一个0,x就变成了0,

case2:5-4-4-5偶数个

x ^= 1 << root->val;

相对简单了,若为此情况,最后一定是0

则判断是否是伪回文序列的条件为:

if (x == 0 || (x & (x - 1)) == 0) return true;