【1163. 按字典序排在最后的子串】

news2025/1/8 5:37:49

来源:力扣(LeetCode)

描述:

给你一个字符串 s ,找出它的所有子串并按字典序排列,返回排在最后的那个子串。

示例 1:

输入:s = "abab"
输出:"bab"
解释:我们可以找出 7 个子串 ["a", "ab", "aba", "abab", "b", "ba", "bab"]。按字典序排在最后的子串是 "bab"

示例 2:

输入:s = "leetcode"
输出:"tcode"

提示:

  • 1 <= s.length <= 4 * 105
  • s 仅含有小写英文字符。

方法:双指针

记字符串 s 的长度为 n。首先并非所有的子字符串都需要被考虑到,只有后缀子字符串才可能是排在最后的子字符串。

为什么只有后缀子字符串才可能是排在最后的子字符串?
考虑一个非后缀子字符串 s1,那么 s1 向后延伸得到的后缀子字符串 s2 比 s1 大,即 s2 排在 s1 后面。

我们用 si ​表示从 s[i] 开始的后缀子字符串,那么可以用指针 i 来指向后缀子字符串 s1 。我们使用指针 i 指向已知的最大后缀子字符串,j 指向待比较的后缀子字符串,初始时有 i = 0,j = 1。一个简单的做法是从小到大枚举 j,如果 si < sj,那么令 i = j,最终的后缀子字符串 si 就是排在最后的子字符串。类似于字符串匹配,在 si 与 sj 的比较过程中,一部分前缀是相等的,我们利用这一点跳过一些不需要进行比较的后缀子字符串。假设 si 与 sj 在第 k 个字符处不相等,即 si[k] ≠ sj[k],那么有两种情况:

  • si[k] < sj[k]
    • 当 i + k > j 时
      • 对于 m ∈ [1, k] 的后缀子字符串 si + m:
        • 如果 m ∈ [k − (j − i) + 1, k],显然有 si + m < sj + m,而 j + m > i + k,因此 si + m 是不需要比较的。
        • 如果 m ∈ [1, k − (j − i)],那么 si + m < sj + m = si+m+j−i ,又因为 m < m + j − i ≤ k,而 si + m 右边的后缀子字符串不需要进行比较,因此 si + m 是不需要进行比较的。

综上,下一个需要进行比较的后缀子字符串为 si+k+1
1

  • 当 i + k ≤ j 时

    • 下一个需要进行比较的后缀子字符串为 sj + 1。
  • si[k] > sj[k]

    • 对于 m ∈ [1, k] 的后缀子字符串 sj + m:
      • 如果 m ∈ [1, j − i],显然有 sj + m < si + m < si
      • 如果 m ∈ [j − i + 1, k],那么 sj + m < si + m = sj+m+i−j < si(因为 1 ≤ m + i − j < m,而 sj + m 左边的后缀子字符串小于 si,因此 sj + m 也小于 si)。

综上,对于 m ∈ [1, k],都有 sj + m < si,所以下一个需要比较的后缀子字符串为 sj+k+1

2

当 sj 为 si 的前缀子字符串,即 j + k = n 时,与情况 si[k] > sj[k] 类似。

代码:

class Solution {
public:
    string lastSubstring(string s) {
        int i = 0, j = 1, n = s.size();
        while (j < n) {
            int k = 0;
            while (j + k < n && s[i + k] == s[j + k]) {
                k++;
            }
            if (j + k < n && s[i + k] < s[j + k]) {
                int t = i;
                i = j;
                j = max(j + 1, t + k + 1);
            } else {
                j = j + k + 1;
            }
        }
        return s.substr(i, n - i);
    }
};

执行用时:28 ms, 在所有 C++ 提交中击败了95.00%的用户
内存消耗:17.9 MB, 在所有 C++ 提交中击败了96.00%的用户
复杂度分析
时间复杂度:O(n),其中 n 是字符串 s 的长度。每 k 次比较,i 与 j 共同至少向右移动 k,因此总比较次数不超过 2 × n 次。
空间复杂度:O(1)。返回值不计算空间复杂度。
author:LeetCode-Solution

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/454744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安波福又有大动作,行泊一体中国方案即将量产

“安波福的目标是&#xff0c;2030年营收达到400亿美元规模&#xff0c;这其中有一大部分收入来自于软件。”安波福亚太区总裁杨晓明在接受高工智能汽车提问时表示。 他介绍&#xff0c;2030年软件业务目标是达到60亿美元的规模&#xff0c;而在2022年&#xff0c;安波福实现了…

Nacos身份绕过漏洞复现(QVD-2023-6271)

Nacos身份绕过漏洞复现&#xff08;QVD-2023-6271&#xff09; 公司上级预警QVD-2023-6271&#xff0c;领导安排进行排查。 本着知己知彼的原则&#xff0c;我在本地将该漏洞复现出来。 漏洞原理&#xff1a;Nacos 在默认配置下未对 token.secret.key 进行修改&#xff0c;导…

【好题】好题分享

1001-四舍五入_牛客竞赛语法入门班数组模拟、枚举、贪心习题 (nowcoder.com) 题目描述 四舍五入是个好东西。比如你只考了45分&#xff0c;四舍五入后你是50分再四舍五入你就是满分啦&#xff01;qdgg刚考完拓扑。成绩十分不理想。但老师觉得他每天都很认真的听课很不容易。于是…

ubuntu 22 安装

下载镜像 下载 https://ubuntu.com/download/server 我这里下载了 22 服务器版 使用工具制作U盘镜像 安装完毕后 插入安装的电脑U盘插口 DEL 进入 选择U盘启动 进入后 我这里选择了第一个&#xff0c;没有选择mini版本 之后进入后按推荐一直安装 在选择静态地址的时候 subn…

你还在用Object.equals()方法吗?

当《阿里巴巴Java开发手册》发布后&#xff0c;我也是仔细进行了阅读&#xff0c;想从中找出一些“标准”&#xff0c;让自己的代码质量提高。手册中对 Object 的 equals 方法的使用进行了强制&#xff0c;而且推荐使用 JDK7 中工具类 Objects 的 equals 方法&#xff0c;至此之…

我在 Linux部署皕杰报表遇到的问题及解决方法

Linux是一种自由和开放源码的类 UNIX 操作系统&#xff0c;作为服务器的操作系统广泛应用。Linux由林纳斯托瓦兹在赫尔辛基大学上学时创立&#xff0c;主要受到 Minix 和 Unix 思想的启发。Linux英文解释为 Linux is not Unix。 皕杰报表支持在linux系统中部署&#xff0c;只需…

短视频矩阵优化系统开发步骤:

1. 矩阵号注册&#xff1a;用户可以通过该功能注册矩阵号&#xff0c;填写个人基本信息并上传身份证明材料进行实名认证。 2. 矩阵号登录&#xff1a;用户使用注册成功的账号密码登录矩阵号系统。 3. 矩阵号管理&#xff1a;用户可以通过该功能管理自己的矩阵号&#xff0c;包…

3 亿岗位将被 AI 取代?巴比特深度采访业界后,“失业潮”真相有些出人意料……...

图片来源&#xff1a;由无界 AI工具生成 人工智能技术的发展正迎来奇点&#xff0c;尤其是今年以来 ChatGPT 和 AIGC 的迅猛势头让无数人猝不及防&#xff0c;真真切切地对各行各业现有的工作岗位产生冲击。近日&#xff0c;蓝色光标全面停止创意设计、方案撰写、文案撰写、短期…

Oracle:ORA-00600[4137]问题分析

背景: 在为用户的新机房环境Oracle 19.18版本数据库检查时&#xff0c;发现smon进程后台日志不断出现事务恢复报错Serial Transaction recovery caught exception 30319&#xff0c;进一步检查发现存在事务恢复失败报ORA-00600[4137] 问题: smon进程后台日志不断出现事务恢复报…

【对比】文心一言对飚ChatGPT实操对比体验

前言 &#x1f34a;缘由 百度【文心一言】体验申请通过 本狗中午干饭时&#xff0c;天降短信&#xff0c;告知可以体验文心一言&#xff0c;苦等一个月的实操终于到来。心中这好奇的对比心理油然而生&#xff0c;到底是老美的【ChatGPT】厉害&#xff0c;还是咱度娘的【文心一…

地下污水厂智能照明控制应用

摘要:结合某地下污水厂项目&#xff0c;从结构、系统组成、系统功能、控制要求、场景模式等方面介绍了地下污水厂智能照明控制系统&#xff0c;探索了一套适用于地下污水厂的智能照明控制策略&#xff0c;以确保地下污水厂正常运行的照明需求。 关键词:智能照明控制系统;地下污…

苦熬10年,国产操作系统“归零”,新操作系统上新,跟Excel很像

苦熬10余年&#xff0c;国产操作系统自主研发 说到国内自主研发的操作系统&#xff0c;经验最丰富的品牌&#xff0c;当然是麒麟OS. 从诞生到发展&#xff0c;历经10多年的努力&#xff0c;麒麟os逐渐成为了国内自主研发操作系统领域中的一颗耀眼的明珠。麒麟OS不仅推出了许多…

Java基础(十)字符串相关类

1 字符串相关类之不可变字符序列&#xff1a;String 1.1 String的特性 java.lang.String 类代表字符串。Java程序中所有的字符串文字&#xff08;例如"hello" &#xff09;都可以看作是实现此类的实例。 字符串是常量&#xff0c;用双引号引起来表示。它们的值在创…

​如何恢复回收站清空的文件?

清空回收站后可以恢复删除的文件吗&#xff1f; 你是否遇到过清空回收站后才意识到某些文件不应删除的情况。发生这种情况时&#xff0c;许多人会感到恐慌&#xff0c;并且想知道是否有可能恢复回收站清空的文件。 事实上&#xff0c;你不必为此担心。当用户清空回收站时&a…

一种大于2GB ONNX模型onnxsim优化方法

大于2GB模型onnxsim优化很耗时&#xff0c;容易挂掉&#xff0c;而且需要特别大的系统内存。 这里提出一种比较简单的优化大于2GB ONNX模型的方法&#xff1a; 基本思路是 把卷积和矩阵乘的权重&#xff08;参数量大于某个阈值&#xff09;替换为ConstantOfShape&#xff0c…

GB/T 28181-2022 新版差异笔记

GB/T 28181-2022 新版差异笔记 文章目录 GB/T 28181-2022 新版差异笔记更改了标准范围删除部分术语和定义增加PTZ缩略语更改SIP监控域互联结构图更改了“联网系统通讯协议结构图”增加了媒体流数据传输的RTP时间戳要求增加了对H.265、AAC的支持更改了SDP协议的引用更改了与其他…

Vue中生成二维码组件——vue-qr——插件市场

最近在重构一个老系统&#xff0c;老系统用的是vueelementUi的框架&#xff0c;现在要更新为vueantdesign的框架模式。 下面记录一下用到的插件&#xff1a; 1.Vue中生成二维码组件——vue-qr vue-qr官网链接&#xff1a;https://www.npmjs.com/package/vue-qr 1.1 安装vue-…

Simulation Extractable Versions of Groth’s zk-SNARK Revisited学习笔记

1. 引言 等人2020年论文《Simulation Extractable Versions of Groth’s zk-SNARK Revisited》&#xff0c;开源代码实现见&#xff1a; https://github.com/Baghery/ABPR22&#xff08;Rust&#xff0c;基于arkworks开发。使用了Multi-Scalar Multiplication (MSM)技术来优化…

json模块和pickle模块

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 json和pickle模块 json模块序列化与反序列化json模块中的方法 pickle模块 专栏&#xff1a;《python从…

IT运维:Windows常用的命令行客户端

对于IT运维人员来说&#xff0c;和命令打交道是必不可少的事情&#xff0c;拥有一个好用的CMD命令行工具&#xff0c;对提升效率是非常有必要的&#xff0c;今天给大家分享Windows常用的命令行客户端&#xff0c;希望对大家能有所帮助&#xff01; 1、PowerShell PowerShell是W…