04-24 每日一题 1163. 按字典序排在最后的子串 学习笔记反思

不晓得脑袋的灵活性是不是和精力的充沛程度相关,看到红色的困难,感觉自信都没了

题目描述

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

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

  • 示例 2
    :::success
    输入:s = “leetcode”
    输出:“tcode”
    :::

自己脑袋是如何运转的

首先看到题目难度程度之后,是有点胆怯的。然后去看题目的时候,仅仅想到了枚举所有可能的子字符串,然后进行排序,取最后一个。很明显是及其弱智且最low的思路😂😂😂😂。然后再稍微思考了几分钟,直接去看题解了。

与题解思路的差别

  1. 通过学习题解,总结出自己的思路缺少的东西。
  2. 首先,忽略了题干信息的提取这一步骤——这一步骤简称为 提炼
  3. 关注数据范围,通过数据范围推测确定目标题目可以用什么级别的时间复杂度解决——这一步骤简称为 复杂度分析
  4. 对提炼后的信息进行分析解析,多举例找到通用的解法——这一步骤简称为 直击答案

提炼

  1. 首先列举出能够提炼出的有用信息,不能着急
    1. 给定的一个目标字符串,其长度范围是 [1, 4*10^5]
    2. 所有子串按照字典序排列,返回排列在最后面的子串
      1. 字典序定义:ex->b a d g 按照字典序排序的结果就是 a b d g
      2. 其实就是按照 a b c d ... x y z 的顺序排序
    3. 返回排列在最后面的子串,其实就是找到字典序最大的子串,这一点相对好想

复杂度分析

  1. 已知数据范围是 字符串长度 = [1, 4*10^5]
  2. 所以在时间复杂度方面需要尽量使用 的时间复杂度来解决该问题

直击答案

  1. 举例说明
    | 原字符串 | 排在最后的子串 |
    | — | — |
    | abab | bab |
    | leetcode | tcode |
    | aaaaaa | aaaaaa |
    | aaaaz | z |
    | zzzzza | zzzzza |

  2. 由于已经参考过题解,可以得出以下结论

    1. 排列在最后的子串,一定是原字符串的后缀
      1. 因为对于 bab 而言,ba 的字典序大于 b 的字典序
    2. 图解分析
    3. image.png
  3. 由上,适用于双指针解决问题

    1. 令 i = 0,j = 1,k = 0,n = len(s)
    2. 如果s[i + k] == s[j + k] k 向后移动,构成的子串分别是 [i, k] [j, k]
    3. 如果s[i + k] < s[j + k] 更新 i = i + k + 1 , j = i + 1
    4. 如果s[i+k] > s[j+k] 更新 j = j + k + 1
  4. 然后抄一遍代码,通透

下一题不能再偷懒了,耐心分析到自己能够分析的极致,加油加油加油
下一题不能再偷懒了,耐心分析到自己能够分析的极致,加油加油加油
下一题不能再偷懒了,耐心分析到自己能够分析的极致,加油加油加油

参考

  1. https://leetcode.cn/problems/last-substring-in-lexicographical-order/solution/an-zi-dian-xu-pai-zai-zui-hou-de-zi-chua-31yl/
  2. https://leetcode.cn/problems/last-substring-in-lexicographical-order/solution/python3javacgotypescript-yi-ti-yi-jie-sh-3amj/
  3. https://leetcode.cn/problems/last-substring-in-lexicographical-order/solution/javapython3shuang-zhi-zhen-bi-jiao-tu-ji-pvb6/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值