//duynotes.blogspot.com
class Solution {
    public int maximalSquare(char[][] matrix) {
        if (matrix.length==0 || matrix[0].length==0){
            return 0;
        }
        
        int m = matrix.length;
        int n = matrix[0].length;
        int [][] dp = new int[2][n+1];
        
        int unique = 0;
        int max = 0;
    
        
        for (int i=0; i<=m; i++){
            unique = i & 1;
            for (int j=0; j<=n; j++){
                if (i==0 || j==0){
                    dp[unique][j] = 0; 
                }
                else if (matrix[i-1][j-1]=='1'){
                    dp[unique][j] = min(dp[unique][j-1],dp[1-unique][j],dp[1-unique][j-1]) + 1;
                }
                else{
                    dp[unique][j]=0;
                }
                
                max = Math.max(max,dp[unique][j]);
            }
        }
        
        return max*max;
    }
    
    private int min(int a, int b, int c){
        return a<b && a<c ? a: (b<c)? b:c;
    }
}