leetcode
leetcode 1551 ~ 1600
构造字典序最大的合并字符串

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

难度:

标签:

题目描述

代码结果

运行时间: 61 ms, 内存: 16.2 MB


// 使用Java Stream的题解代码和注释

/*
题目思路:
1. 使用Stream和StringBuilder来合并两个字符串,获取字典序最大的字符串。
2. 使用Stream.iterate生成不断递增的索引来访问word1和word2的字符。
*/

import java.util.stream.Stream;

public class Solution {
    public String largestMerge(String word1, String word2) {
        StringBuilder merge = new StringBuilder();
        Stream.iterate(new int[]{0, 0}, pair -> pair[0] < word1.length() || pair[1] < word2.length())
              .forEach(pair -> {
                  int i = pair[0], j = pair[1];
                  if (i >= word1.length()) {
                      merge.append(word2.charAt(j));
                      pair[1]++;
                  } else if (j >= word2.length()) {
                      merge.append(word1.charAt(i));
                      pair[0]++;
                  } else if (word1.substring(i).compareTo(word2.substring(j)) > 0) {
                      merge.append(word1.charAt(i));
                      pair[0]++;
                  } else {
                      merge.append(word2.charAt(j));
                      pair[1]++;
                  }
              });
        return merge.toString();
    }
}

解释

方法:

此题解的基本思路是贪心算法。在每一步中,比较两个字符串word1和word2的字典序。如果word1的字典序大于word2,或者在字典序相等的情况下,选择word1的首字符添加到结果字符串merge中;否则选择word2的首字符。这样的选择基于当前可见的信息,以确保每一步都能取得当前可能的最大字典序。当其中一个字符串为空时,将另一个非空字符串的剩余部分全部追加到merge中,得到最终结果。

时间复杂度:

O((n+m)^2)

空间复杂度:

O(n+m)

代码细节讲解

🦆
贪心算法在对比字符串时是如何处理相等情况的,尤其是当后续字符也相等时该如何决策?
在贪心算法中,如果当前比较的两个字符串的首字符相等,算法将考虑后续的所有字符来做决策。这意味着,如果word1和word2的首字符相同,算法不仅仅比较这一个字符,而是比较整个剩余的字符串。例如,如果word1和word2的首字符相同,那么接下来会比较剩余的word1[1:]和word2[1:]。这个过程会递归地继续,直到找到一个不相等的字符或者其中一个字符串结束。这种方法确保了每一步选择都是基于尽可能多的信息,从而使得最终合成的字符串具有最大的字典序。
🦆
题解中提到当一个字符串为空时,直接将另一个字符串剩余部分加入到merge中,这样做是否可能导致不是最大字典序的结果?
当题解中提到的情况发生时,即其中一个字符串已经完全被使用(即为空),那么将另一个字符串的剩余部分直接加入到结果字符串merge中,是正确的做法。这是因为,当一个字符串为空时,另一个字符串的任何非空前缀都在字典序上大于空字符串。因此,直接将剩余的非空字符串加到合并字符串的末尾,不会导致字典序的降低,确保了结果字符串是最大的字典序。
🦆
在循环中比较word1和word2的字典序时,是否考虑了全部剩余字符的比较,还是仅限于当前首字符?
在循环中比较word1和word2的字典序时,考虑的是全部剩余字符而不仅仅是首字符。在Python中,字符串比较是按照字典序进行的,比较操作会从两个字符串的开头开始,逐字符进行比较,直到找到一个不相等的字符或者一个字符串结束。这样的比较确保了每一步决策都是基于尽可能完整的信息,从而使得最终的合并字符串具有最大可能的字典序。

相关问题