括号配对 区间DP 回文匹配

🍑 算法题解专栏


var code = "8ba817da-e6a1-4629-adf5-a2afba1b0da0"

🍑 括号配对
在这里插入图片描述

输入

[])

输出

1

🍑 f[ i ][ j ]:表示 i~j 区间内所有合法括号的长度


import java.util.Scanner;

public class Main
{
	static int N = 110;
	static String s;
	static int[][] f = new int[N][N];// 0~n 之间所有合法括号的长度和

	static boolean check(int l, int r)
	{
		char a = s.charAt(l);
		char b = s.charAt(r);
		if ((a == '(' && b == ')') || (a == '[' && b == ']'))
			return true;
		return false;
	}

	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		s = sc.next();
		int n = s.length();

		for (int len = 2; len <= n; len++)
		{
			for (int l = 0; l + len - 1 < n; l++)
			{
				int r = l + len - 1;
				if (check(l, r))// s[l] 和 s[r] 匹配
					f[l][r] = Math.max(f[l][r], f[l + 1][r - 1] + 2);
//				左右边界不匹配,分开两组求解
				for (int k = l; k <= r; k++)// k 枚举左边选多少个
					f[l][r] = Math.max(f[l][r], f[l][k] + f[k + 1][r]);

			}
		}
		System.out.println(n - f[0][n - 1]);
	}
}
posted @ 2023-04-26 17:02  兑生  阅读(9)  评论(0编辑  收藏  举报  来源
Live2D