解法

通过暴力法,一点一点的尝试。
动态规划,一个位置的能构成的最大正方形,是依赖三个位置的。

代码

暴力法

public int maximalSquare(char[][] matrix) {
        int max=Integer.MIN_VALUE;
        for(int i=0;i<matrix.length;i++)
            for(int j=0;j<matrix[0].length;j++)
            {
                if(matrix[i][j]=='1')
                {
                    max=Math.max(max,f(matrix,i,j));
                }
            }
        return max==Integer.MIN_VALUE?0:max;
    }
    public int f(char[][] matrix,int i,int j)
    {
        int s=1;
        while(i+s<matrix.length&&j+s<matrix[0].length&&matrix[i+s][j+s]=='1'){
            for(int q=0;q<s;q++)
            {
                if(matrix[i+s][j+q]!='1') return s*s;
            }
            for(int q=0;q<s;q++)
            {
                if(matrix[i+q][j+s]!='1') return s*s;
            }
            s++;
        }
        return s*s;
    }

动态规划

public int maximalSquare(char[][] matrix) {
        if(matrix.length==0) return 0;
        int[][] dp=new int[matrix.length+1][matrix[0].length+1];
        int max=Integer.MIN_VALUE;
        for(int i=0;i<matrix.length;i++)
        {
            for(int j=0;j<matrix[0].length;j++)
            {
                if(matrix[i][j]=='1')
                {
                    int min=Math.min(dp[i][j],dp[i][j+1]);
                    min=Math.min(min,dp[i+1][j])+1;
                    dp[i+1][j+1]=min;
                    max=Math.max(max,dp[i+1][j+1]);
                }
            }
        }
        return max*max;
    }