All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g2701_2800.s2746_decremental_string_concatenation.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g2701_2800.s2746_decremental_string_concatenation;

// #Medium #Array #String #Dynamic_Programming
// #2023_09_24_Time_34_ms_(85.89%)_Space_50.1_MB_(44.78%)

/**
 * 2746 - Decremental String Concatenation\.
 *
 * Medium
 *
 * You are given a **0-indexed** array `words` containing `n` strings.
 *
 * Let's define a **join** operation `join(x, y)` between two strings `x` and `y` as concatenating them into `xy`. However, if the last character of `x` is equal to the first character of `y`, one of them is **deleted**.
 *
 * For example `join("ab", "ba") = "aba"` and `join("ab", "cde") = "abcde"`.
 *
 * You are to perform `n - 1` **join** operations. Let str0 = words[0]. Starting from `i = 1` up to `i = n - 1`, for the ith operation, you can do one of the following:
 *
 * *   Make stri = join(stri - 1, words[i])
 * *   Make stri = join(words[i], stri - 1)
 *
 * Your task is to **minimize** the length of strn - 1.
 *
 * Return _an integer denoting the minimum possible length of_ strn - 1.
 *
 * **Example 1:**
 *
 * **Input:** words = ["aa","ab","bc"]
 *
 * **Output:** 4
 *
 * **Explanation:** In this example, we can perform join operations in the following order to minimize the length of str2: 
 *
 * str0 = "aa" 
 *
 * str1 = join(str0, "ab") = "aab" 
 *
 * str2 = join(str1, "bc") = "aabc" 
 *
 * It can be shown that the minimum possible length of str2 is 4.
 *
 * **Example 2:**
 *
 * **Input:** words = ["ab","b"]
 *
 * **Output:** 2
 *
 * **Explanation:** In this example, str0 = "ab", there are two ways to get str1: join(str0, "b") = "ab" or join("b", str0) = "bab". The first string, "ab", has the minimum length. Hence, the answer is 2.
 *
 * **Example 3:**
 *
 * **Input:** words = ["aaa","c","aba"]
 *
 * **Output:** 6
 *
 * **Explanation:** In this example, we can perform join operations in the following order to minimize the length of str2: 
 *
 * str0 = "aaa" 
 *
 * str1 = join(str0, "c") = "aaac" 
 *
 * str2 = join("aba", str1) = "abaaac" 
 *
 * It can be shown that the minimum possible length of str2 is 6.
 *
 * **Constraints:**
 *
 * *   `1 <= words.length <= 1000`
 * *   `1 <= words[i].length <= 50`
 * *   Each character in `words[i]` is an English lowercase letter
**/
public class Solution {
    private Integer[][][] dp;

    public int minimizeConcatenatedLength(String[] words) {
        int n = words.length;
        dp = new Integer[n][26][26];
        String curWord = words[0];
        int curLen = curWord.length();
        char curFirst = curWord.charAt(0);
        char curLast = curWord.charAt(curLen - 1);
        return curLen + solve(1, curFirst, curLast, n, words);
    }

    private int solve(int idx, char prevFirst, char prevLast, int n, String[] words) {
        if (idx == n) {
            return 0;
        }
        if (dp[idx][prevFirst - 'a'][prevLast - 'a'] != null) {
            return dp[idx][prevFirst - 'a'][prevLast - 'a'];
        }
        String curWord = words[idx];
        int curLen = curWord.length();
        char curFirst = curWord.charAt(0);
        char curLast = curWord.charAt(curLen - 1);
        int ans = (int) 1e9;
        if (prevFirst == curLast) {
            ans = Math.min(ans, curLen - 1 + solve(idx + 1, curFirst, prevLast, n, words));
        } else {
            ans = Math.min(ans, curLen + solve(idx + 1, curFirst, prevLast, n, words));
        }
        if (prevLast == curFirst) {
            ans = Math.min(ans, curLen - 1 + solve(idx + 1, prevFirst, curLast, n, words));
        } else {
            ans = Math.min(ans, curLen + solve(idx + 1, prevFirst, curLast, n, words));
        }
        dp[idx][prevFirst - 'a'][prevLast - 'a'] = ans;
        return ans;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy