日拱算法,按字典序排在最后的子串

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

image.png

日拱算法,接着冲,这玩意儿是会有瘾是吧?


题目:



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


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

题目来源:按字典序排在最后的子串


题解:



这题题干很简洁,比什么兔子问题、果篮问题好理解很多。看题之后,很明显的一个概念需要清楚,那就是:字典序排列!


什么是字典序排列?


字典序是指按照单词出现在字典的顺序进行排序的方法。比如 b 在 a 后面,c 在 b 后面,aba 在 ab 后面;bc 在 bac 后面;

所以问题的关键在于理解:什么样的字符串会在字典序排列更靠后?


我们发现:

当前面一截相同,那么肯定是越长的子串字典序越大;比如 abcdX 必定要大于 abcd;


因此以某个字符 x 开头的子串最大的一定是以 x 所在位置为起点、s 最后一个字符为终点的子串


明白这个后,我们在先找出字典序最大的字符 x ,然后依次找每一个以“x 开头的最大字串”,依次对比大小,取最大值,最后返回结果。


JavaScript 实现:

var lastSubstring = function(s) {
  // 找出字典序最大的字母:char
    let arr=new Array(26).fill(0);
    for(let c of s){
        arr[c.charCodeAt()-97]=1;
    }
    let char;
    for(let i=arr.length-1;i>=0;i--){
        if(arr[i]>0){
            char=String.fromCharCode(i+97);
            break;
        }
    }
    //由前至后依次找出所有以char开头的最大子串,并取其中字典序最大的子串
    let index=-1;
    let ans = ""
    while((index=s.indexOf(char,index+1))>=0){
        if(s.substr(index)>ans){
            ans = s.substr(index);
        }
    }
    return ans;
}

image.png

以上解法不是最简单的,看到下面这个最简单解法真的会震惊到:


var lastSubstring = function(s) {
    let ans = ""
    for(let i=0;i<s.length;i++){
        if(s.substr(i)>ans){
            ans = s.substr(i);
        }
    }
    return ans;
};


直接就是字符串截取,然后用大于符号比较,则可满足条件;

"abcdX">"abcd" //ture

小结:这个题目的难度定义为“困难”,一时感觉茫然,有时候的中等题或简单题比这个要困难很多。。。


相关文章
|
算法 Java
【Java每日一题,字典序算法】下一个排列
【Java每日一题,字典序算法】下一个排列
|
3月前
|
算法
【算法】滑动窗口——最小覆盖子串
【算法】滑动窗口——最小覆盖子串
|
3月前
|
算法 容器
【算法】滑动窗口——串联所有单词的子串
【算法】滑动窗口——串联所有单词的子串
|
5月前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
5月前
|
机器学习/深度学习 算法 测试技术
【算法优选】 动态规划之子数组、子串系列——壹
【算法优选】 动态规划之子数组、子串系列——壹
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
5月前
|
存储 机器学习/深度学习 算法
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
|
5月前
|
人工智能 算法
【算法优选】 动态规划之子数组、子串系列——贰
【算法优选】 动态规划之子数组、子串系列——贰
|
6月前
|
人工智能 算法 测试技术
【字符串】【C++算法】828.统计子串中的唯一字符
【字符串】【C++算法】828.统计子串中的唯一字符
|
6月前
|
设计模式 算法 Java
【数据结构和算法】定长子串中元音的最大数目
这是力扣的 1456 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。又是一道滑动窗口的典型例题,可以帮助我们巩固滑动窗口算法。给你字符串s和整数k。 请返回字符串s中长度为k的单个子字符串中可能包含的最大元音字母数。 英文中的元音字母为(a,e,i,o,u)。
80 1