开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情
是谁,是谁周六还要上班,哦~原来是我自己
构造字典序最大的合并字符串
该题出自力扣的1754题 —— 构造字典序最大的合并字符串【中等题】
审题
- 这道题看着很长,其实有点绕,给出两个字符串,要求把两个字符串拼接成一个字符串返回
- 两个字符串变量的首字母进行拼接
- 并且要按照字典序的大小进行逆序
- 按照题意分解就是,分别遍历两个字符串
- 判断两个字符的字典序大小,字典序较大的存放
- 最终两个字符串遍历完,形成一个全新的字符串返回
- 用指针 i 和 j 分别指向字符串
word1和word2的第一个字符,每次比较 word1[i] 和 word2[j]的大小,如果 word1[i] 比 word2[j] 大,那么我们就将 word1[i] 加入答案,否则我们就将 word2[j] 加入答案。循环,直至 i 到达字符串 word1 的末尾,或者 j 到达字符串 word2 的末尾。 - 当前字符相等,选择字典序最大的字符串添加字符;当前字符相等,两字符串字典序也相等,任选一个字符串添加字符;
- 当然了,还会有优化的方法,就是利用后缀法。利用后缀数组来比较两个后缀的字典序大小,进行合并时我们可以直接比较两个字符串的后缀排序,每次选取后缀较大的进行合并即可。相较于第一张解法更不容易被超时,也会比第一种双指针的更为优雅
编码
class Solution {
public String largestMerge(String word1, String word2) {
StringBuilder sb = new StringBuilder();
int i =0,j =0;
while (i < word1.length() || j < word2.length()){
if (i < word1.length() && word1.substring(i).compareTo(word2.substring(j)) > 0){
sb.append(word1.charAt(i++));
}else {
sb.append(word2.charAt(j++));
}
}
return sb.toString();
}
}