Problem: 2050E - Three Strings
Language: java

Solution 1 (runtime: 624 ms):
import java.io.*;
import java.lang.reflect.Array;
import java.util.*;

public class MyClass {
    public static void main(String[] args) {
        FastScanner in = new FastScanner();
        PrintWriter out = new PrintWriter(System.out);
        int t = in.nextInt();
        while (t-- > 0)
            solve(in, out);
        out.close();
    }
    static long pow(long x,long n, long m) {
        if(n==0) return 1;
        else if(n%2==0) return pow((x*x)%m,n/2,m)%m;
        else return (x*pow((x*x)%m,n/2,m))%m;
    }

    static int gcd(int a,int b) {
        if(b==0) return a;
        else return gcd(b,a%b);
    }

    static int ans;
    static void findSum(int[][] a,int i, int j, int sum) {
        if(i>2 || j>2) return;
        findSum(a,i,j+1, a[i][j]+sum);
        findSum(a,i+1,j, a[i][j]+sum);
        if(i==2 && j==2) ans=Math.min(a[i][j]+sum, ans);
    }

    static char[] a,b,c;
    static int A[][];
    static int findMaxMatching(int i, int j, int k){
        if(i>=a.length){
            int total=0;
            for (int l = j; l < b.length; l++) {
                if(b[l]==c[k]){
                   total++;
                }
                k++;
            }
            return total;
        }
        if(j>=b.length){
            int total=0;
            for (int l = i; l < a.length; l++) {
                if(a[l]==c[k]){
                    total++;
                }
                k++;
            }
            return total;
        }
        if(A[i][j]>0) return A[i][j];
        int possibilityA = findMaxMatching(i+1,j,k+1);
        if(a[i]==c[k]){
            possibilityA++;
        }
        int possibilityB = findMaxMatching(i,j+1,k+1);
        if(b[j]==c[k]){
            possibilityB++;
        }
        A[i][j] = Math.max(possibilityA, possibilityB);
        return A[i][j];
    }
    static void solve(FastScanner in,PrintWriter out) {
        a=in.next().toCharArray();
        b=in.next().toCharArray();
        c=in.next().toCharArray();
        A=new int[a.length][b.length];
        int max = findMaxMatching(0,0,0);
        out.println(c.length-max);
    }

    static class pair<U extends Comparable<U>, V extends Comparable<V>> implements Comparable<pair<U, V>> {
        public U x;
        public V y;

        public pair(U x, V y) {
            this.x = x;
            this.y = y;
        }

        public int compareTo(pair<U, V> other) {
            int i = other.y.compareTo(y);
            if (i != 0) return i;
            return other.x.compareTo(x);
        }

        public String toString() {
            return x.toString() + " " + y.toString();
        }

        public boolean equals(Object obj) {
            if (this.getClass() != obj.getClass()) return false;
            pair<U, V> other = (pair<U, V>) obj;
            return x.equals(other.x) && y.equals(other.y);
        }

        public int hashCode() {
            return 31 * x.hashCode() + y.hashCode();
        }

    }

    static void sort(int[] a) {
        ArrayList<Integer> l=new ArrayList<>();
        for (int i:a) l.add(i);
        Collections.sort(l);
        for (int i=0; i<a.length; i++) a[i]=l.get(i);
    }
    static void sortR(int[] a) {
        ArrayList<Integer> l=new ArrayList<>();
        for (int i:a) l.add(i);
        Collections.sort(l,Collections.reverseOrder());
        for (int i=0; i<a.length; i++) a[i]=l.get(i);
    }

    static class FastScanner {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer("");
        String next() {
            while (!st.hasMoreTokens())
                try {
                    st=new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }
        int[] readArray(int n) {
            int[] a=new int[n];
            for (int i=0; i<n; i++) a[i]=nextInt();
            return a;
        }
        long nextLong() {
            return Long.parseLong(next());
        }
    }
}

Solution 2 (runtime: 280 ms):
import java.util.*;

public class ThreeStrings {
    // Custom print functions
    public static void print(Object print) {
        System.out.print(print);
    }

    public static void println(Object print) {
        System.out.println(print);
    }

    public static void println() {
        System.out.println();
    }

    // Declare a 2D dp array to store memoization results
    static int[][] dp;

    // Function to compute the minimum changes required
    public static int func(int i, int j, char[] a, char[] b, char[] c) {
        int n = c.length;
        // Base case: if all characters are matched
        if (i + j >= n) return 0;

        // Check if result is already calculated
        if (dp[i][j] != -1) return dp[i][j];

        int take_a = Integer.MAX_VALUE;
        int take_b = Integer.MAX_VALUE;

        // Try taking a character from 'a'
        if (i < a.length) {
            if (a[i] == c[i + j]) {
                take_a = func(i + 1, j, a, b, c); // No change needed
            } else {
                take_a = 1 + func(i + 1, j, a, b, c); // Change needed
            }
        }

        // Try taking a character from 'b'
        if (j < b.length) {
            if (b[j] == c[i + j]) {
                take_b = func(i, j + 1, a, b, c); // No change needed
            } else {
                take_b = 1 + func(i, j + 1, a, b, c); // Change needed
            }
        }

        // Store and return the minimum changes required
        return dp[i][j] = Math.min(take_a, take_b);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt(); // Number of test cases

        for (int l = 0; l < t; l++) {
            char[] a = sc.next().toCharArray(); // Input string a
            char[] b = sc.next().toCharArray(); // Input string b
            char[] c = sc.next().toCharArray(); // Target string c

            int m = a.length;
            int n = b.length;
            int len = c.length;

            // Initialize dp array with -1
            dp = new int[m + 1][n + 1];
            for (int[] row : dp) {
                Arrays.fill(row, -1);
            }

            // Compute and print result
            println(func(0, 0, a, b, c));
        }
        sc.close();
    }
}