【每日一题Day226】L1156单字符重复子串的最大长度 | 贪心+滑动窗口

简介: 【每日一题Day226】L1156单字符重复子串的最大长度 | 贪心+滑动窗口

单字符重复子串的最大长度【L1156】

如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。

给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。

思路:贪心+滑动窗口

为了获得最达长度的单字符重复子串,我们一定是找到以某个字符text[i]为首的最长子串[i,j−1];然后跳过一个不同的字符text[j],继续向后搜索最长重复子串[j+1,k1]为了使长度增大,我们应该从其他位置替换一个相同字符至位置j,那么此时最长重复子串为text[i,k1]但是还需要判断字符text[i]的数量与字符串长度的关系k1i+1

如果该字符的数量count大于等于ki那么说明可以从其他位置替换一个相同字符,此时最长重复子串长度为该字符的数量ki

如果该字符的数量小于k1i+1那么说明所有字符都在前后子串中,只能将首或者尾字符进行交换,此时最长重复子串长度为该字符的数量count

下一个字符从字符text[j]开始搜索,忽略t e x t [ i , j − 1 ] 内的字符一定不是最优解,因为其前缀重复子串不是最优的

  • 实现
class Solution {
    public int maxRepOpt1(String text) {
        int n = text.length();
        int[] count = new int[26];
        int res = 0;
        for (int i = 0; i < n; i++){
            count[text.charAt(i) - 'a']++;
        }
        int i = 0;
        while (i < n){
            // 搜索最长重复子串text[i, j - 1]
            int j = i + 1;          
            while (j < n && text.charAt(i) == text.charAt(j)){
                j++;
            }
            // 搜索最长重复子串text[j + 1, k - 1]
            int k = j + 1;
            while (k < n && text.charAt(i) == text.charAt(k)){
                k++;
            }
            res = Math.max(res, Math.min(k - i, count[text.charAt(i) - 'a']));
            i = j;
        }
        return res;
    }
}

复杂度

  • 时间复杂度:O ( n )
  • 空间复杂度:O ( C )
目录
相关文章
|
3月前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
6月前
|
算法 C++
【优选算法】——滑动窗口——3. 无重复字符的最长子串
【优选算法】——滑动窗口——3. 无重复字符的最长子串
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
5月前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
|
6月前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
37 0
|
6月前
|
存储 算法 JavaScript
Leetcode算法系列| 3. 无重复字符的最长子串
Leetcode算法系列| 3. 无重复字符的最长子串
|
6月前
|
存储 算法 程序员
【算法训练-字符串 一】【子串问题】最长无重复子串、最长回文子串、最长公共前缀
【算法训练-字符串 一】【子串问题】最长无重复子串、最长回文子串、最长公共前缀
67 0
|
算法
【算法专题突破】双指针 - 无重复字符的最长子串(10)
【算法专题突破】双指针 - 无重复字符的最长子串(10)
34 0
|
算法 C++
剑指offer(C++)-JZ48:最长不含重复字符的子字符串(算法-动态规划)
剑指offer(C++)-JZ48:最长不含重复字符的子字符串(算法-动态规划)
|
算法 前端开发 JavaScript
[LeetCode] 无重复字符的最长子串 & 最长回文子串
博主最近在看新的工作机会,也是在找一些leetcode上比较高频的算法复习一下,这里分享两道算法题的解题。
69 2
[LeetCode] 无重复字符的最长子串 & 最长回文子串