学习内容

LeeCodeJava

424.替换后最长重复字符

我的代码(参考)

  1. class Solution {
  2. public int characterReplacement(String s, int k) {
  3. int[] letters=new int[26];
  4. int left=0;
  5. int right=0;
  6. int maxLetter=0;
  7. for (right = 0; right < s.length(); right++) {
  8. //计入字母数量
  9. letters[s.charAt(right)-'A']++;
  10. //获得目前最大的字母数量
  11. maxLetter= Math.max(maxLetter,letters[s.charAt(right)-'A']);
  12. //计算不合规的字母数量:maxLetter在开始的时候为1了,所以要+1回正
  13. if(right-left-maxLetter+1>k){
  14. letters[s.charAt(left)-'A']--;
  15. left++;
  16. }
  17. }
  18. return right-left;
  19. //right的最终值会额外加一次1;
  20. }
  21. }

思路:

将字符串规整为字符,字符数量的集合类.从最小的长度的开始替换,替换的时候从k里面减,减完为止.(抛弃)

题解思路:

使用滑动窗口的思想,从左侧开始找,逐步将整个字符串给获取.
如果发现左指针和右指针之间出现了超过预计的字符数量,就将左指针右移.
每次循环都需要将右指针右移,以尽可能扩大目标字符串的长度.

优解代码

  1. class Solution {
  2. public int characterReplacement(String s, int k) {
  3. int[] num = new int[26];
  4. int n = s.length();
  5. int maxn = 0;
  6. int left = 0, right = 0;
  7. while (right < n) {
  8. num[s.charAt(right) - 'A']++;
  9. maxn = Math.max(maxn, num[s.charAt(right) - 'A']);
  10. while (right - left + 1 - maxn > k) {
  11. num[s.charAt(left) - 'A']--;
  12. left++;
  13. }
  14. right++;
  15. }
  16. return right - left;
  17. }
  18. }

心得:

其将左端点的移动从if改成了while,注意的情况大概是在最大字符串中的特征字母改变过后,左指针可能需要连续跳过很多字母,如果用if的话,每次左移才能使用一次if,感觉会比较麻烦,其他的思路类似.