class Solution {
    // 把当前元素作为矩阵的右下角,用一个数组记录当前行到当前位置的连续的1的个数,得到矩阵的最大宽
    // 垂直遍历,计算宽和高,得到面积,求出对应位置面积的最大值
    public int maximalRectangle(char[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;
        int maxArea = 0;
        int[][] maxWidth = new int[row][col]; // 记录以当前元素为右下角的最大宽
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (matrix[i][j] == '1') {
                    maxWidth[i][j] = (j > 0) ? maxWidth[i][j - 1] + 1 : 1;
                }
            }
        }
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (matrix[i][j] == '1') {
                    int width = maxWidth[i][j];
                    int area = width;
                    for (int k = i - 1; k >= 0; k--) {
                        width = Math.min(maxWidth[k][j], width); //构建矩形的最大宽
                        area = Math.max(width*(i - k + 1), area);
                    }
                    maxArea = Math.max(area, maxArea);
                }
            }
        }
        return maxArea;
    }
}