Files
leetcode-master/problems/kamacoder/小红的区间翻转.md
programmercarl 2c32229383 Update
2024-07-15 16:49:16 +08:00

2.6 KiB
Raw Blame History

import java.util.Scanner;

public class Main {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int[] a = new int[n];
    int[] b = new int[n];

    for (int i = 0; i < n; i++) {
        a[i] = sc.nextInt();
    }

    for (int i = 0; i < n; i++) {
        b[i] = sc.nextInt();
    }

    int  p = -1, s = -1;
    for (int i = 0; i < n; i++) {
        if (a[i] == b[i]) p = i;
        else break;
    }

    for (int j = n - 1 ; j >= 0 ; j--) {
        if (a[j] == b[j]) s = j;
        else break;
    }


    boolean[][] dp = new boolean[n][n];
    int res = 0;

    for (int j = 0; j < n; j++) {
        for (int i = j ; i >= 0 ; i--) {
            if (i == j) dp[i][j] = a[i] == b[i];
            else if (i + 1 == j) dp[i][j] = (a[i] == b[j] && a[j] == b[i]);
            else {
                dp[i][j] = dp[i+1][j-1] && (a[i] == b[j] && a[j] == b[i]);
            }
            if (dp[i][j] && (i == 0 || p >= i-1) && (j == n - 1 || j+1 >= s))  res++;
        }
    }
    System.out.println(res);
}

}

import java.util.Scanner;

public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt();

    int[] a = new int[n];
    int[] b = new int[n];

    for (int i = 0; i < n; i++) {
        a[i] = sc.nextInt();
    }

    for (int i = 0; i < n; i++) {
        b[i] = sc.nextInt();
    }

    int count = 0;

    // 遍历所有可能的区间
    for (int left = 0; left < n; left++) {
        for (int right = left; right < n; right++) {
            // 检查翻转区间 [left, right] 后a 是否可以变成 b
            if (canTransform(a, b, left, right)) {
                count++;
            }
        }
    }

    System.out.println(count);
}

private static boolean canTransform(int[] a, int[] b, int left, int right) {
    // 提前检查翻转区间的值是否可以匹配
    for (int i = left, j = right; i <= right; i++, j--) {
        if (a[i] != b[j]) {
            return false;
        }
    }

    // 检查翻转区间外的值是否匹配
    for (int i = 0; i < left; i++) {
        if (a[i] != b[i]) {
            return false;
        }
    }

    for (int i = right + 1; i < a.length; i++) {
        if (a[i] != b[i]) {
            return false;
        }
    }

    return true;
}

}