leetcode 算法题 Star

2020-03-26  本文已影响0人  Zak1

典例

class Solution {
      public int longestSubstring(String s, int k) {
          if (s.length() < k) return 0;
          return countLongestSubstring(s.toCharArray(), 0, s.length() - 1, k);
      }
      private int countLongestSubstring(char[] chars, int l, int r, int k) {
          int[] count = new int[26];
          for (int i = l; i <= r; i++) {
              count[chars[i] - 'a']++;
          }
          //使得左右指针所在位置的字符满足条件(两指针之间仍然可能存在不满足条件的字符)
          while (r - l + 1 >= k && count[chars[l] - 'a'] < k) l++;
          while (r - l + 1 >= k && count[chars[r] - 'a'] < k) r--;
            //当筛选完毕后如果长度不满足K则返回0
          if (r - l + 1 < k) return 0;
         
          //对初筛满足条件的子串进行遍历,出现不满足条件的字符,以字符为分割,左右继续递归查询,直到满足所有的count[chars[i] - 'a']都>=K则 返回  r - l + 1
          for (int i = l; i < r; i++) {
              if (count[chars[i] - 'a'] < k) {
                  return Math.max(countLongestSubstring(chars, l, i - 1, k), countLongestSubstring(chars, i + 1, r, k));
              }
          }
          return r - l + 1;
      }
  }
 

分而治之

动态规划

上一篇 下一篇

猜你喜欢

热点阅读