算法日志 --- 12.24--- 构造字典序最大的合并字符串

100 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情

是谁,是谁周六还要上班,哦~原来是我自己

构造字典序最大的合并字符串

该题出自力扣的1754题 —— 构造字典序最大的合并字符串【中等题】

审题

image.png

  • 这道题看着很长,其实有点绕,给出两个字符串,要求把两个字符串拼接成一个字符串返回
    • 两个字符串变量的首字母进行拼接
    • 并且要按照字典序的大小进行逆序
  • 按照题意分解就是,分别遍历两个字符串
  • 判断两个字符的字典序大小,字典序较大的存放
  • 最终两个字符串遍历完,形成一个全新的字符串返回
  • 用指针 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();
    }
}

image.png