[leetcode 周赛 149] 1156 单字符重复子串的最大长度

2023-10-26

1156 Swap For Longest Repeated Character Substring 单字符重复子串的最大长度

描述

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

  • 示例 1:

    输入:text = "ababa"
    输出:3
    解释: 我们可以用最后一个“a”替换第一个“b”,或者用第一个“a”替换最后一个“b”。然后,最长的重复字符子串是“aaa”,其长度为3

  • 示例 2:

    输入:text = "aaabaaa"
    输出:6
    解释: 用最后一个“a”(或第一个“a”)替换“b”,我们得到最长的重复字符子串“aaa”,其长度为6

  • 示例 3:

    输入:text = "aaabbaaa"
    输出:4

  • 示例 4:

    输入:text = "aaaaa"
    输出:5
    解释: 无需交换,最长重复字符子串为“aaa”,长度为5

  • 示例 5:

    输入:text = "abcdef"
    输出:1

  • 提示:
    1 <= text.length <= 20000
    text 仅由小写英文字母组成。

思路

滑动窗口思想
维持一个'窗口', 它拥有左右边界, 并且可以扩展
本题中, '窗口'以某一位置为起点, 向右移动,
1)等于原位置字符的,则+1,
2)不等于的,则看右边还有没有可以交换相等字符并有没有容错空间(原为1, 使用后为0)
1640888-20190817105427866-1493512424.png

  • 注意:特殊情况
    "aaba" 这种右边有交换字符, 但紧接着容错字符(不相等但可以容忍的), 会计算出超过字符频数的结果

代码实现

class Solution {
    public int maxRepOpt1(String text) {
        if (null == text | text.length() <= 0) return 0;
        
        int len = text.length();
        char[] chs = text.toCharArray();
        //cnt 字符串中所出现字符的频数
        int[] cnt = new int[30];
        // type 字符串中字符种类
        int type = 0;
        
        for (char c : chs) {
            int ind=c-'a';
            if (cnt[ind]==0) type++;
            cnt[ind]++;
        }
        // 字符串中字符没有重复
        if (type == len) return 1;
        // 字符串中字符全部单字符重复
        if (type == 1) return len;
        
        // size 重复子串最大长度/滑动窗口最大长度
        int size = 0;
        for (int i = 0; i < len;) {
            char begin = chs[i];
            // now 当前重复子串最大长度
            // time 容错余裕 可以结合字符频数提前判断 
            //      cnt[begin-'a']==1 --> time=0 没有可以交换字符 容错余裕为0
            // next 下一个窗口开始位置(因为i++ 会导致有些计算冗余 可以直接从容错位置开始)
            int now = 0, time = 1, next=i+1;
            // 滑动窗口向右扩展
            for (int j = i; j < len; j++) {
                // 相等
                if (chs[j]==begin) now++;
                // 不相等 但有容错和可交换字符
                else if ((time-- > 0) && (cnt[begin-'a']-now >= 1)) {now++; next=j;}
                else break;
            }

            // 特殊情况 计算长度必定不大于字符频数
            now = now > cnt[begin-'a'] ? cnt[begin-'a'] : now;
            // 比较原最大长度与当前长度
            size = now > size ? now : size;
            i = next;
        }
        
        return size;
    }
}

转载于:https://www.cnblogs.com/slowbirdoflsh/p/11367818.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[leetcode 周赛 149] 1156 单字符重复子串的最大长度 的相关文章

  • 以OpenGL/ES视角介绍gfx-hal(Vulkan) Shader/Program接口使用

    文档列表见 Rust 移动端跨平台复杂图形渲染项目开发系列总结 目录 背景 The right way to tackle this in Vulkan is to use resource descriptors A descriptor
  • 数据库多维迭代算法

    关键词 数据库 迭代 递归 多维 一 两种传统的数据库迭代结构算法 对于数据库的迭代结构 有两种传统的算法 递归算法和边界算法 比如对于下面图1的结构 图1 递归算法的数据结构如表1所示 节点id 节点值 父节点id 1 1111 2 3
  • 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.29. Coreutils-8.23...

    Coreutils 软件包包含用于显示和设置基本系统特性的工具 大概编译时间 2 5 SBU 需要磁盘空间 193 MB 6 29 1 安装 Coreutils POSIX 要求 Coreutils 中的程序即使在多字节语言环境也能正确识别
  • 树06--二叉树中和为某一值的路径

    树06 二叉树中和为某一值的路径 jz24 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 输入一颗二叉树的根节点和一个整数 按字典序打印出二叉树中结点值的和为输入整数的所有路径 路径定义为从树的根结点开始往下一直到叶结点所经
  • 将二叉树转为有序的双向链表

    一 题目要求 输入一棵二叉排序树 现在要将该二叉排序树转换成一个有序的双向链表 而且在转换的过程中 不能创建任何新的结点 只能调整树中的结点指针的指向来实现 include
  • 数据结构之链表与线性表

    数据结构之链表与线性表 线性表 顺序线性表 顺序表 顺序线性表 使用数组实现 一组地址连续的存储单元 数组大小有两种方式指定 一是静态分配 二是动态扩展 优点 随机访问特性 查找O 1 时间 存储密度高 逻辑上相邻的元素 物理上也相邻 缺点
  • 数据结构----链式栈

    目录 前言 链式栈 操作方式 1 存储结构 2 初始化 3 创建节点 4 判断是否满栈 5 判断是否空栈 6 入栈 7 出栈 8 获取栈顶元素 9 遍历栈 10 清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法 链接 线性表 栈 栈
  • 链表和线性表的优缺点

    链表和线性表的优缺点 作为我们最先接触的两个数据结构 链表和线性表的优缺点都较为明显 并且二者互相补足 文章目录 链表和线性表的优缺点 线性表 线性表的组成 线性表的缺点 线性表的优点 链表 链表的组成 链表的优点 链表的缺点 总结 线性表
  • 微软2013暑假实习生笔试题

    自己mark一下 以作后备 下面提交原文链接 原文博客 部分题目答案不确定 会持续更新 1 Which of the following calling convention s support s supportvariable leng
  • 常用的十种算法--马踏棋盘算法

    1 马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8 8 棋盘 Board 0 7 0 7 的某个方格中 马按走棋规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部 64 个方格 2 马踏棋盘算法
  • DNG格式解析

    Author Maddock Date 2015 04 22 转载请注明出处 http www cnblogs com adong7639 p 4446828 html DNG格式基本概念 DNG格式是在TIFF的基础上扩展出来的 要了解D
  • 递归算法中的时间复杂度分析

    对于一种算法的时间复杂度分析还是特别重要的 在一些非递归算法中 我们仅仅看运算次数最多的那一行代码可能执行多少次就可以 实际就是看在循环中变量的变化 但是对于递归算法中该怎么分析呢 下面介绍几种递归函数中的算法时间复杂度分析的方法 0 递推
  • JavaScript系列——数组元素左右移动N位算法实现

    引言 在自己刚刚毕业不久的时候 去了一家公司面试 面试官现场考了我这道题 我记忆深刻 当时没有想到思路 毫无疑问被面试官当成菜鸟了 最近刚好在研究数组的各种算法实现 就想到这道题 可以拿来实现一下 纪念自己逝去的青春 需求 假设有这样一个数
  • 4Sum

    Given an array S of n integers are there elements a b c and d in S such that a b c d target Find all unique quadruplets
  • 堆栈01--用两个栈实现队列

    堆栈01 用两个栈实现队列 jz05 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 测试用例 队列先进先出 输入 1 2 输出 1 2 解析
  • 数理统计知识整理——回归分析与方差分析

    题记 时值我的北科研究生第一年下 选学 统计优化 课程 备考促学 成此笔记 以谨记 1 线性回归 1 1 原理分析 要研究最大积雪深度x与灌溉面积y之间的关系 测试得到近10年的数据如下表 使用线性回归的方法可以估计x与y之间的线性关系 线
  • Leetcode1094. 拼车

    Every day a Leetcode 题目来源 1094 拼车 解法1 差分数组 对于本题 设 a i 表示车行驶到位置 i 时车上的人数 我们需要判断是否所有 a i 都不超过 capacity trips i 相当于把 a 中下标从
  • 数组实现循环队列(增设队列大小size)

    目录 一 前言 1 如何实现循环 2 如何判断队列为空 3 如何判断队列为满 二 循环队列的结构定义 三 循环队列的创建及其初始化 四 入队 五 出队 六 取队头元素 七 取队尾元素 八 循环队列判空 九 循环队列判满 十 循环队列销毁 一
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • C++ AVL树(四种旋转,插入)

    C AVL树 四种旋转 插入 一 AVL树的概念及性质 二 我们要实现的大致框架 1 AVL树的节点定义 2 AVL树的大致框架 三 插入 1 插入逻辑跟BST相同的那一部分 2 修改平衡因子

随机推荐

  • qt中ui的 使用介绍

    1 什么是ui ui通常是用Qt 设计师设计出来的界面文件的后缀 通常情况下ui是一个指向这个界面类的指针 ui gt 一般就是用来访问这个界面类里面的控件 例如你的ui文件里有一个叫okButton的QPushButton 你就可以这样来
  • Apache Hook机制解析(下)——实战:在自己的代码中使用Apache的钩子

    在前文 Apache Hook机制解析 上 钩子机制的实现 和 Apache Hook机制解析 中 细节讨论 的基础上 我们对Apache的钩子机制已经有了较多的了解 下面的代码实战演示了一个日志钩子的声明 定义和使用 在VC6 0上编译测
  • MMClassification(一)

    1 介绍 一句话总结 基于pytorch的强大模块化组件式的分类框架 相关资料 中文文档 GitHub 课程学习 深入学习直接使用官方文档学习效果最好 本文记录学习过程知识以便快速回顾和查找 其中包含个人的学习总结 仅做参考 2 项目结构
  • 刷脸支付还可以带来新的互动体验和应用

    支付宝领先的微信支付是依附于电商的绝对优势 微信支付凭借其10亿用户的优势 正在与支付宝抗衡 近几年来 移动支付的快速发展带动了支付技术的变革 nfc支付 二维码支付 指纹支付等支付方式活跃在我们的日常生活中 随着人脸识别技术的成熟和人们对
  • 三菱FX3U——ST编程红绿灯

    一个循环周期是32秒 南北向绿灯和东西向红灯亮10秒后 两侧黄灯亮3秒 黄灯在闪烁3秒 南北向红灯和东西向绿灯亮10秒 两侧黄灯亮3秒 黄灯在闪烁3秒 添加启动和停止 按下启动按钮 使定时器复位 通过置位M0 让标签的状态赋值给输出点 通过
  • DataGrip的简单使用笔记

    目录 导入数据 关键字导航 全局搜索 结果集搜索 导航到关联数据 结果集数据过滤 行转列 变量重命名 自动检测无法解析的对象 权限定字段名 通配符自动展开 大写自动转换 sql格式化 多光标模式 代码注释 列编辑 https pan bai
  • rk3399 高可靠OTA升级

    https blog csdn net m0 37631324 article details 106254910
  • auto_deleter 使用,定义自动销毁对象

    template
  • Windows中安装ElasticSearch(单机+集群+Kibana)

    系统版本 Windows 10 ElasticSearch版本 7 15 2 https artifacts elastic co downloads elasticsearch elasticsearch 7 15 2 windows x
  • linux 网卡驱动升级,安装或更新CentOS平台的网卡驱动程序

    基于Linux平台安装或更新网卡驱动程序与Windows平台相差不大 首先查阅出主机网卡的具体型号 Windows平台可以借助鲁大师等硬件检测工具查看网卡 Linux平台有适用的命令lspci ethtool查看 在CentOS6 7平台下
  • 【欧拉openEuler 】 ssh安装、配置和远程控制

    1 查看SSH是否安装 一般是默认安装好了的 changairjb localhost rpm qa grep ssh libssh 0 9 5 1 oe1 aarch64 openssh 8 2p1 13 oe1 aarch64 open
  • 01-初识HTML

    01 初识HTML 学习目标 理解HTML的基本语法 掌握排版标签实现标题等效果 相对路径和绝对路径 媒体标签 图片 音频 视频 超链接 一 基础认知 了解网页组成和五大浏览器 明确Web标准的构成 1 1 认识网页 以下网页有哪些部分组成
  • (C语言)16进制转10进制

    include
  • Java反射机制与Method的invoke方法实现

    一 什么是反射 1 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息 从而操作类或对象的属性和方法 本质是JVM得到class对象之后 再通过class对象进行反编译 从而获取对象的各种信息 2 Java属于先编译再运行的语
  • 机械革命黑苹果改造计划第四番-外接显示器、win时间不正确问题解决

    问题 1 无法外接显示器 最大的问题就是目前无法外接显示器 因为机械革命大多数型号笔记本电脑的HDMI DP接口都是直接物理接在独显上的 内屏用核显外接显示器接独显 英伟达独显也是黑苹果无法驱动的 而且发现机械革命tpyec接口还减配了没有
  • CSA作业

    1 修改当前主机名为rhcsa 设置当前时区为Asia Shanghai 2 在 home和 root目录下面创建file1文件和dir1目录 3 在 home file1文件里面写入内容hello welcome to home 4 在
  • Python中进程和线程详解与四款Python程序库

    Num01 gt 线程 线程是操作系统中能够进行运算调度的最小单位 它被包含在进程之中 是进程中的实际运作单位 一个线程指的是进程中一个单一顺序的控制流 一个进程中可以并发多条线程 每条线程并行执行不同的任务 Num02 gt 进程 进程就
  • Qt报错: error: C2001: 常量中有换行符,解决QT运行时有中文乱码

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一 问题原因 二 解决办法 1 第一种方法 改变文件的编码格式 2 第二种方法 修改代码 总结 前言 在编译别人的Qt工程中 总会遇到莫名其妙的问题 在别人机器上运行好好的工程 拷贝到自己
  • BAPI_ACC_DOCUMENT_POST 税码未在任何总分类账目中出现

    BAPI ACC DOCUMENT POST 报错 税码未在任何总分类账目中出现 原因 BAPI不支持auto tax caculate 单独录入税分录 需要设置一下direct tax
  • [leetcode 周赛 149] 1156 单字符重复子串的最大长度

    目录 1156 Swap For Longest Repeated Character Substring 单字符重复子串的最大长度 描述 思路 代码实现 1156 Swap For Longest Repeated Character S