具体思想:
牛皮的状态压缩+前缀,这两个都没想到;
自己当时想用滑动窗口做,但是发现有个问题:收缩的时候无法进行判断;
例如:213213;
从21开始收缩无法判断,因为后续的和前面的相加可能是个满足要求的序列;
题解的思想:
使用一个9 bit的序列计算每位上是偶数还是奇数,并且使用map记录该状态出现的位置;
这里很多题解都没有讲清楚:
- 如果不同节点的两个状态相同,则说明,其间必定是回文满足,并且,他们的个数必定是偶数;
例如:1,1,2,2和1,1,1,2,2,2,两者在1和2位上的奇偶状态相同,则必定他们的每位字符差是2的倍数,所以必定满足; - 如果两个状态只有一位不同,也就是说只有一位奇偶不同,则说明个数必为奇数;
例如:1,1,2和1,1,1,2,两者在一位上不同,则只需要调整该位使其差距是2的倍数,即可构成回文子串;
总而言之,状态需要满上述两种情况,才可以保证他们中间相隔的字符满足偶数(成对出现),或者奇数(只有一个不成对,剩下的都成对出现);
具体代码:
class Solution {
public:
int longestAwesome(string s) {
unordered_map<int,int>ump;
ump[0]=0;
int ret=0;
int qz=0;
for(int i=1;i<=s.size();i++){
int num=s[i]-'0';
qz^=1<<i;
if(ump.count(qz)){
ret=max(ret,i-ump[qz]);
}else{
ump[qz]=i;
}
for(int i=0;i<10;i++){
int temp=qz^(1<<i);
if(ump.count(temp)){
ret=max(ret,i-ump[temp]);
}
}
}
return ret;
}
};