首页 > 其他分享 >1163. 按字典序排在最后的子串

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

时间:2023-04-24 22:00:42浏览次数:45  
标签:子串 开头 1163 后缀 答案 字典 序排 指针

题目链接:1163. 按字典序排在最后的子串

方法:双指针

解题思路

【正常走路我不走,就是跳,就是玩】

  • 任何非后缀子串字典序都小于其相应的后缀子串,如 \(s[i, i + k] < s[i, n - 1]\), \(k < n - 1\),故答案一定为后缀子串,即 \(s[i, n - 1]\);
  • 观察数据规模,\(4 * 10^5\),暴力一定超时;
  • 法宝:双指针
    • 指针 \(i\) :指向以当前可能为答案的后缀子串的开头;
    • 指针 \(j\) :指向下一个可能为答案的后缀子串的开头;
    • 同时给两个指针加上相同的偏移量 \(k\)(每次初始为 \(0\)) ,直到所指向的字符 \(s[i + k] != s[j + k]\),因为当 \(s[i, i + k] == s[j, j + k]\) 时,由于 \(i\) 在前,答案一定不会是 \(j\) 开头后缀子串;
    • \(s[i + k] < s[j + k]\) ,说明 \(s[i, i + k] < s[j, j + k]\);
      • 此时 \([i, i + k]\) 区间的字符一定不会为答案的后缀子串的开头,因为 \(s[i + m, i + k] < s[j + m, j + k]\),那么就跳过这段非答案数组,\(i += k + 1\);
      • 若此时 \(i >= j\),即 \([i, i + k + 1]\) 覆盖了 \(j\),那么应该将 \(j = i + 1\),指向 \(i\) 的下一个继续比较;
    • \(s[i + k] > s[j + k]\),说明 \(s[i, i + k] > s[j, j + k]\) ;
      • 此时 \([j, j + k]\) 区间的字符一定不会为答案的后缀子串的开头,因为 \(s[j + m, j + k] < s[i + m, i + k]\),那么就跳过这段非答案数组,\(j += k + 1\);

代码

class Solution {
public:
    string lastSubstring(string s) {
        int i = 0, j = 1, n = s.length();
        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]) {
                i += k + 1;
                if (i >= j) j = i + 1;
            } else {
                j += k + 1;
            }
        }
        return s.substr(i);
    }
};

复杂度分析

时间复杂度:\(O(n)\);
空间复杂度:\(O(1)\)。

标签:子串,开头,1163,后缀,答案,字典,序排,指针
From: https://www.cnblogs.com/lxycoding/p/17351084.html

相关文章

  • 力扣——5.最长回文子串(c语言)
    题目描述:给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为1000。示例1:输入:"babad"输出:"bab"注意:"aba"也是一个有效答案。示例2:输入:"cbbd"输出:"bb"1、思路1:动态规划对于一个子串而言,如果它是回文子串,并且长度大于2,那么将它首尾两个字......
  • 最长公共子串
    最长公共子串给定两个字符串,求这两个字符串的不包含数字的最长公共子串的长度。输入格式共两行,每行一个由小写字母和数字构成的字符串。输出格式一个整数,表示给定两个字符串的不包含数字的最长公共子串的长度。如果不存在满足要求的非空公共子串,则输出$0$。数据范围输入......
  • 倒序排序 空放在最下
    NullLast不适用于spring数据jpa这是我正在使用的代码。服务层代码:Sortsort=newSort(newSort.Order(Sort.Direction.DESC,"user_name").nullsLast());Pageablepageable=PageRequest.of(0,10,sort);userRepository.findAllUsers(pageable) 回购层代码:@Q......
  • Eddy's digital Roots 1163 (数学+九余数定理)
    Eddy'sdigitalRootsTimeLimit:2000/1000MS(Java/Others)   MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):5278   AcceptedSubmission(s):2952ProblemDescriptionThedigitalrootofapositiveintegerisfoundbysumming......
  • #yyds干货盘点# LeetCode程序员面试金典:串联所有单词的子串
    题目:给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串长度相同。 s 中的串联子串是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如,如果 words=["ab","cd","ef"],那么 "abcdef", "abefcd","cdabef", "cdefab","efabcd",......
  • 【题解】P6292 区间本质不同子串个数
    原题链接区间本质不同子串个数题目描述给定一个长度为\(n\)的字符串\(S\),\(m\)次询问由\(S\)的第\(L\)到第\(R\)个字符组成的字符串包含多少个本质不同的子串。定义两个字符串\(a,b\)相同当且仅当\(|a|=|b|\)并且对于\(i\in[1,|a|]\)都有\(a_i=b_i\)。输入......
  • 团体天梯练习 L2-008 最长对称子串
    L2-008最长对称子串对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定IsPAT&TAPsymmetric?,最长对称子串为sPAT&TAPs,于是你应该输出11。输入格式:输入在一行中给出长度不超过1000的非空字符串。输出格式:在一行中输出最长对称子串的长度。输入样例:IsPAT&TAP......
  • 洛谷T226686 长度为2的子串
    题目描述给你一个长度为n 的由大写的英文字母组成的字符串,请你找出出现频率最高的长度为2的子串。输入格式包括两行。第一行是一个正整数n,表示字符串长度。第二行是长度为n的大写英文字母组成的字符串。(2<=n<=100)输出格式包括一行。一个长度为2的字符串,该字符串为输入......
  • #yyds干货盘点# LeetCode面试题:最小覆盖子串
    1.简述:给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。 注意:对于t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。如果s中存在这样的子串,我们保证它是唯一的答案。......
  • 华为OD机试 最左侧冗余覆盖子串
    本期题目:最左侧冗余覆盖子串题目给定两个字符串s1和s2和正整数K,其中s1长度为n1,s2长度为n2,在s2中选一个子串,满足:该子串长度为n1+k该子串中包含s1中全部字母,该子串每个字母出现次数不小于s1中对应的字母,我们称s2以长度k冗余覆盖s1,给定s1,s2,k,求最左侧的s2以长度k冗余覆盖......