构造字典序最大的合并字符串
难度:
标签:
题目描述
代码结果
运行时间: 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)
代码细节讲解
🦆
贪心算法在对比字符串时是如何处理相等情况的,尤其是当后续字符也相等时该如何决策?
▷🦆
题解中提到当一个字符串为空时,直接将另一个字符串剩余部分加入到merge中,这样做是否可能导致不是最大字典序的结果?
▷🦆
在循环中比较word1和word2的字典序时,是否考虑了全部剩余字符的比较,还是仅限于当前首字符?
▷