LeetCode-in-Java

2896. Apply Operations to Make Two Strings Equal

Medium

You are given two 0-indexed binary strings s1 and s2, both of length n, and a positive integer x.

You can perform any of the following operations on the string s1 any number of times:

Return the minimum cost needed to make the strings s1 and s2 equal, or return -1 if it is impossible.

Note that flipping a character means changing it from 0 to 1 or vice-versa.

Example 1:

Input: s1 = “1100011000”, s2 = “0101001010”, x = 2

Output: 4

Explanation: We can do the following operations:

The total cost is 1 + 1 + 2 = 4. It can be shown that it is the minimum cost possible.

Example 2:

Input: s1 = “10110”, s2 = “00011”, x = 4

Output: -1

Explanation: It is not possible to make the two strings equal.

Constraints:

Solution

import java.util.ArrayList;

public class Solution {
    public int minOperations(String s1, String s2, int x) {
        int n = s1.length();
        ArrayList<Integer> diffs = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            if (s1.charAt(i) != s2.charAt(i)) {
                diffs.add(i);
            }
        }
        int m = diffs.size();
        if ((m & 1) == 1) {
            return -1;
        } else if (m == 0) {
            return 0;
        }
        int[] dp = new int[m];
        dp[0] = 0;
        dp[1] = Math.min(x, diffs.get(1) - diffs.get(0));
        for (int i = 2; i < m; i++) {
            if ((i & 1) == 1) {
                dp[i] = Math.min(dp[i - 1] + x, dp[i - 2] + diffs.get(i) - diffs.get(i - 1));
            } else {
                dp[i] = Math.min(dp[i - 1], dp[i - 2] + diffs.get(i) - diffs.get(i - 1));
            }
        }
        return dp[m - 1];
    }
}