力扣1542.找出最长的超赞子字符串
题目解析及思路
题目要求找到通过任意次数交换后能使子串变成回文串的最大长度
也就是说每个数出现次数为偶数
用一个10位的二进制数表示状态即可
-
状态压缩 + 前缀和
- 回文子串有奇数和偶数两种
- 需要同时考虑,奇数时遍历每一种字符(都有可能作为那个奇数)
- 偶数时为第一次出现过同样情况的下标
代码
class Solution {
int D = 10;
public:
int longestAwesome(string s) {
int n = s.size();
vector<int> pos(1<<D,INT_MAX);
pos[0] = -1;
int ans=0,pre=0;
for(int i=0;i<n;i++)
{
pre ^= 1 << (s[i] - '0');
//奇数
//枚举10个位置分别作为最中间的数
for(int d=0;d<D;d++)
ans = max(ans,i - pos[pre^(1<<d)]);
//偶数
ans = max(ans,i-pos[pre]);
//如果状态第一次出现
if(pos[pre] == INT_MAX)
pos[pre] = i;
}
return ans;
}
};