给你一个字符串 s,找出它的所有子串并按字典序排列,返回排在最后的那个子串。
示例 1:
输入:"abab"
输出:"bab"
解释:我们可以找出 7 个子串 ["a", "ab", "aba", "abab", "b", "ba", "bab"]。按字典序排在最后的子串是 "bab"。
示例 2:
输入:"leetcode"
输出:"tcode"
提示:
1 <= s.length <= 10^5
s 仅含有小写英文字符。
1.简单循环出所有的组合,再比较得出最大的一个数据(字典序排列的)
/** * @param {string} s * @param {number} numRows * @return {string} */ //按照字典序排序 function comp(max,new_word){ let i_max = 0; let i_new_word = 0; while(i_max<max.length&&i_new_word<new_word.length){ if(max.charCodeAt(i_max)<new_word.charCodeAt(i_new_word)){ return new_word; }else if(max.charCodeAt(i_max)>new_word.charCodeAt(i_new_word)){ return max; }else{ i_max++; i_new_word ++; } } //循环结束之后,出现以下情况 //1.当max的长度小于new_word的长度 if(i_max>=max.length&&i_new_word>=new_word.length){//当两个元素的完全相同的时候,随便返回一个 return max; } if(i_max>=max.length){ return new_word; } if(i_new_word>=new_word.length){ return max; } } var convert = function(s) { let temp = []; let max = ""; for(let i=0;i<s.length;i++){ for(let j=i+1;j<=s.length;j++){ let demo =s.substring(i,j); if(temp.indexOf(demo)==-1){ temp.push(demo);//插入数据到temp中 max = comp(max,demo); } } } console.log(max) return max; }; console.log(convert("leetcode"))
2.找出最大的元素的下标,然后切割以最大元素开头的字符串,进行字典排序比较
/** * @param {string} s * @return {string} */ function compBychar(max_char,new_char){ if(max_char.charCodeAt()<new_char.charCodeAt()){ return 1;//当新的字符大于最大值,就返回1 }else{ return 0;//等于或小于的时候忽略,主要是为了检索到第一个最大的元素的索引值 } } var lastSubstring = function(s) { let temp = []; let max_char = s[0]; let index = 0;//最大元素的索引值 let max = ""; //循环求得第一个字符是字典排序最大的元素 for(let i=0;i<s.length;i++){ if(compBychar(max_char,s[i])==1){//直接进行比较就可以了,不用自己写 max_char<s[i] max_char = s[i]; index = i; } } //查找以最元素开头的字符串所有(即t1xxxxxt2uuuuu,即t1到最后与t2到最后比较) for(let i=index;i<s.length;i++){ if(s[i] == max_char){ if(max<s.substring(i)){ max = s.substring(i); } } } return max; };
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/last-substring-in-lexicographical-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。