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 merge and delete it from word1.
For example, if word1 = “abc” and merge = “dv”, then after choosing this operation, word1 = “bc” and merge = “dva”.
If word2 is 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”.
Return the lexicographically largest merge you can construct.
A string a is lexicographically larger than a string b (of the same length) if in the first position where a and b differ, a has a character strictly larger than the corresponding character in b. For example, “abcd” is lexicographically larger than “abcc” because the first position they differ is at the fourth character, and d is greater than c.
Example 1:
Input: word1 = “cabaa”, word2 = “bcaaa”
Output: “cbcabaaaaa”
Explanation: One way to get the lexicographically largest merge is:
Example 2:
Input: word1 = “abcabc”, word2 = “abdcaba”
Output: “abdcabcabcaba”
Constraints:
与前两天做的那个 hard 的题目类似, 只不过那个题目拆解成了几个小问题, 这题与其中的一个小问题是一样的。逐个字符的比较两个字符串, 大于或者小于都好处理, 唯独等于的比较复杂一点, 需要看后面的字符, 如果比较到最后都一样则比较两个字符串的长度, 我们认为长的那个更大, 因为我们从长的这个拿字符,下一次比较时可以引入新的字符进行比较
impl Solution {
fn is_greater(word1: &[char], word2: &[char]) -> bool {
let mut i = 0;
while i < word1.len() && i < word2.len() {
if word1[i] > word2[i] {
return true;
}
if word1[i] < word2[i] {
return false;
}
i += 1;
}
if word1.len() > word2.len() {
return true;
}
false
}
pub fn largest_merge(word1: String, word2: String) -> String {
let chars1: Vec<char> = word1.chars().collect();
let chars2: Vec<char> = word2.chars().collect();
let mut i = 0;
let mut j = 0;
let mut merge = Vec::new();
while i < chars1.len() || j < chars2.len() {
if Solution::is_greater(&chars1[i..], &chars2[j..]) {
merge.push(chars1[i]);
i += 1;
continue;
}
merge.push(chars2[j]);
j += 1;
}
merge.into_iter().collect()
}
}