题目

类型:位运算
image.png

解题思路

对于某个子串而言,我们只关心大小写是否同时出现,而不关心出现次数。
因此我们无须使用二维数组来记录具体的词频
可以在枚举子串时,使用两个 int 的低 26 位分别记录大小写字母的出现情况,利用枚举子串时右端点后移,维护两变量,当且仅当两变量相等时,满足 26 个字母的大小写同时出现或同时不出现。

代码

  1. class Solution {
  2. public String longestNiceSubstring(String s) {
  3. int n = s.length();
  4. int idx = -1, len = 0;
  5. for (int i = 0; i < n; i++) {
  6. int a = 0, b = 0;
  7. for (int j = i; j < n; j++) {
  8. char c = s.charAt(j);
  9. if (c >= 'a' && c <= 'z') a |= (1 << (c - 'a'));
  10. else b |= (1 << (c - 'A'));
  11. if (a == b && j - i + 1 > len) {
  12. idx = i; len = j - i + 1;
  13. }
  14. }
  15. }
  16. return idx == -1 ? "" : s.substring(idx, idx + len);
  17. }
  18. }