我们要用空间换时间
leecode1542
class Solution {
const int D = 10; // s中字符串的种类数
public:
int longestAwesome(string s) {
int n = s.size();
vector<int> pos(1 << D, n); // n 表示没有找到异或前缀和
pos[0] = -1;
int ans = 0, pre = 0;
for (int i = 0; i < n; i++) {
pre ^= 1 << (s[i] - '0');
for (int d = 0; d < D; d++) {
// 这个逻辑怎么理解呢,就是说,如果前面没有找到和他一样,这个位置就
// n , i-n 的值是一个小于等于0 的数,那么ans不会改变
ans = max(ans, i - pos[pre ^ (1 << d)]);
// 这里的 异或上 1<<d 就是考虑奇数
}
ans = max(ans, i - pos[pre]);
if (pos[pre] == n) {
pos[pre] = i;
}
}
return ans;
}
};
class Solution:
def longestAwesome(self, s: str) -> int:
D = 10
n = len(s)
pos = [n] * (1 << D)
pos[0] = -1 # pre[-1] = 0
# 必须需要这一步,如果没有的话,单个数字进来得到的结果是0
ans = 0
pre = 0
for i in range(n):
di = int(s[i])
pre ^= 1<<di # 我们需要计算的是
for j in range(D):
ans = max(ans,i-pos[pre^(1<<j)]) # 考虑奇数 且 pos[0] = -1 在这里起作用
ans = max(ans,i-pos[pre])
if pos[pre] == n:
pos[pre] = i
return ans