Largest Merge Of Two Strings

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:

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:
- Take from word1: merge = "c", word1 = "abaa", word2 = "bcaaa"
- Take from word2: merge = "cb", word1 = "abaa", word2 = "caaa"
- Take from word2: merge = "cbc", word1 = "abaa", word2 = "aaa"
- Take from word1: merge = "cbca", word1 = "baa", word2 = "aaa"
- Take from word1: merge = "cbcab", word1 = "aa", word2 = "aaa"
- Append the remaining 5 a's from word1 and word2 at the end of merge.

Example 2:

Input: word1 = "abcabc", word2 = "abdcaba"
Output: "abdcabcabcaba"

 

Constraints:


Solution:


Explanation


Just compare the string s1 and s2,
if s1 >= s2, take from s1
if s1 < s2, take from s2


it makes sense once you come up with it.

Complexity


Feel like it's
Time O(mn)
Space O(mn)


Java


    public String largestMerge(String s1, String s2) {
        if (s1.length() == 0  || s2.length() == 0)
            return s1 + s2;
        if (s1.compareTo(s2) > 0)
            return s1.charAt(0) + largestMerge(s1.substring(1), s2);
        return s2.charAt(0) + largestMerge(s1, s2.substring(1));
    }


class Solution {    
    public String largestMerge(String word1, String word2) {
        int m = word1.length(), n = word2.length();
        return helper(word1, word2, 0, 0);
    }
    
    private String helper(String word1, String word2, int i, int j) {
        if (i == word1.length()) {
            return word2.substring(j);
        }
        if (j == word2.length()) {
            return word1.substring(i);
        }
        char a = word1.charAt(i), b = word2.charAt(j);
        if (a < b) {
            return String.valueOf(b) + helper(word1, word2, i, j + 1);
        } else if (a > b) {
            return String.valueOf(a) + helper(word1, word2, i + 1, j);
        } else {
            for (int k = 1; k + i < word1.length() && k + j < word2.length(); k ++) {
                char c = word1.charAt(i + k);
                char d = word2.charAt(j + k);
                if (c < d) {
                    return String.valueOf(b) + helper(word1, word2, i, j + 1);
                } else if (c > d) {
                    return String.valueOf(a) + helper(word1, word2, i + 1, j);
                }
            }
            if (word1.substring(i).length() < word2.substring(j).length()) {
                return String.valueOf(b) + helper(word1, word2, i, j + 1);
            } else {
                return String.valueOf(a) + helper(word1, word2, i + 1, j);
            }
        }
    }
}