1. 题目链接 https://leetcode.cn/problems/longest-nice-substring/
    2. 方法签名

      1. public String longestNiceSubstring(String s);
    3. 测试用例

      1. @Test
      2. public void test_longestNiceSubstring_success() {
      3. LongestNiceSubstringSol sol = new LongestNiceSubstringSol();
      4. Assert.assertEquals("aA", sol.longestNiceSubstring("aAzaHZ"));
      5. Assert.assertEquals("aAa", sol.longestNiceSubstring("YazaAay"));
      6. Assert.assertEquals("Bb", sol.longestNiceSubstring("Bb"));
      7. Assert.assertEquals("dD", sol.longestNiceSubstring("dDzeE"));
      8. }
    4. 朴素暴力解 ```java public String longestNiceSubstring(String s) { char[] chars = s.toCharArray(); int n = chars.length;

      int start = -1; int maxLen = 0;

      for (int i = 0; i < n; i++) {

      1. for (int j = i+1; j < n; j++) {
      2. if (j-i+1 > maxLen && checkNiceSubstring(chars, i, j)) {
      3. start = i;
      4. maxLen = j-i+1;
      5. }
      6. }

      } return start == -1 ? “” : s.substring(start, start+maxLen); }

    private boolean checkNiceSubstring(char[] chars, int i, int j) { Set occ = new HashSet<>(); for (int p = i; p <= j; p++) { occ.add(chars[p]); } for (int p = i; p <= j; ++p) { char c = chars[p]; char lower = Character.toLowerCase(c); char upper = Character.toUpperCase(c); if (!occ.contains(lower) || !occ.contains(upper)) { return false; } } return true; } ```

    1. 前缀和
    2. 二进制优化