【每日一题Day66】LC1754构造字典序最大的合并字符串 | 贪心 双指针模拟

简介: 思路:双指针遍历两个字符串,贪心比较字符的字典顺序,并添加至结果集

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


You are given two strings word1 and word2. You want to construct a string merge in the following way: while either word1 or word2 are non-empty, choose one of the following options:


  • If word1 is non-empty, append the first character in word1 to mergeand delete it from word1


。For example, if word1 = "abc" and merge = "dv", then after choosing this operation, word1 = "bc" and merge = "dva".


  • If word2is non-empty, append the first character in word2 to merge and delete it from word2


。For example, if word2 = "abc" and merge = "", then after choosing this operation, word2 = "bc" and merge = "a".


虽然烤红薯很好吃 但是被烤箱烫伤了瞬间就不香了

现在的医院全是咳嗽的哎 真可怕哎


  • 思路:双指针遍历两个字符串,贪心比较字符的字典顺序,并添加至结果集


局部最优:优先选择后缀字符串的字典顺序较大的字符至结果集


全局最优:合并后的字符串的字典顺序最大


。如果两个指针对应的字符不相等,直接将字典顺序较大的字符加入结果集的末尾,并且移动改字符串对应的指针

。如果两个指针对应的字符相等,那么需要比较后缀字符串的字典顺序

  • 添加较大者对应的字符至结果集
  • 如果字典顺序相同,那么添加任意字符均不会影响结果


  • 实现


。先使用双指针对字符进行比较直至移动到一个字符串的末尾

。此时直接将另一个非空字符串剩余的字符添加至结果集即可


class Solution {
    public String largestMerge(String word1, String word2) {
        StringBuilder sb = new StringBuilder();
        int n = word1.length(), m = word2.length();
        int i = 0, j = 0;
        while (i < n && j < m){
            char ch1 = word1.charAt(i), ch2 = word2.charAt(j);
            if (ch1 > ch2){
                sb.append(ch1);
                i++;
            }else if (ch1 < ch2){
                sb.append(ch2);
                j++;
            }else{
                // 字符相等 需要判断后续字符的字典顺序
                if (i < n && word1.substring(i).compareTo(word2.substring(j)) > 0){
                    sb.append(ch1);
                    i++;
                }else{
                    sb.append(ch2);
                    j++;
                }
            }      
        }
        if (i < n){
            sb.append(word1.substring(i));
        }
        if (j < m){
            sb.append(word2.substring(j));
        }
        return new String(sb);
    }
}


。复杂度


efb3d8865338cb78737d771cb9cc98b4.png


  • 时间复杂度:O(min(m,n)∗min(m,n)),m和n分别为字符串的长度,先压入字符进行比较,需要比较min(m,n)次,若两个字符串相等那么需要进行后缀比较的时间复杂度为O(min(m,n))次


  • 空间复杂度:O(m+n),生成的后缀字符串所需要的空间为O(m+n)


  • 实现:每一次比较均比较后缀字符串


代码好看,时间复杂度稍微高一点


class Solution {
    public String largestMerge(String word1, String word2) {
        StringBuilder merge = 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) {
                merge.append(word1.charAt(i));
                i++;
            } else {
                merge.append(word2.charAt(j));
                j++;
            }
        }
        return merge.toString();
    }
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/largest-merge-of-two-strings/solutions/2030226/gou-zao-zi-dian-xu-zui-da-de-he-bing-zi-g6az1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


。复杂度


d9283c70a875169281879bf596bf6104.png


  • 时间复杂度:O((m+n)∗max(m,n)),m和n分别为字符串的长度,先压入字符进行比较,需要比较(m+n)次,每次需要进行后缀比较的时间复杂度为O(max(m,n))次


  • 空间复杂度:O(m+n),生成的后缀字符串所需要的空间为O(m+n)
目录
相关文章
C4.
|
6月前
|
存储 程序员 C语言
C语言中如何通过指针引用字符串
C语言中如何通过指针引用字符串
C4.
67 0
|
6月前
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
48 0
|
6月前
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
37 0
|
6月前
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
44 0
|
6月前
|
算法 C语言
通过指针引用字符串
通过指针引用字符串
62 1
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
6月前
|
存储 C++
C++程序中的字符串与指针
C++程序中的字符串与指针
61 2
|
6月前
|
C语言
C语言指针与字符串
C语言指针与字符串
36 0
|
C语言
C语言之字符串的连接使用指针和调用函数两种方法
C语言之字符串的连接使用指针和调用函数两种方法
263 0
|
6月前
|
安全 C语言
指针与字符串:C语言中的深入探索
指针与字符串:C语言中的深入探索
109 0