题目
类型:位运算
解题思路
对于某个子串而言,我们只关心大小写是否同时出现,而不关心出现次数。
因此我们无须使用二维数组来记录具体的词频
可以在枚举子串时,使用两个 int 的低 26 位分别记录大小写字母的出现情况,利用枚举子串时右端点后移,维护两变量,当且仅当两变量相等时,满足 26 个字母的大小写同时出现或同时不出现。
代码
class Solution {
public String longestNiceSubstring(String s) {
int n = s.length();
int idx = -1, len = 0;
for (int i = 0; i < n; i++) {
int a = 0, b = 0;
for (int j = i; j < n; j++) {
char c = s.charAt(j);
if (c >= 'a' && c <= 'z') a |= (1 << (c - 'a'));
else b |= (1 << (c - 'A'));
if (a == b && j - i + 1 > len) {
idx = i; len = j - i + 1;
}
}
}
return idx == -1 ? "" : s.substring(idx, idx + len);
}
}