import java.util.*;
//采用动态规划,该问题明显具有最优子结构。
//递推关系式:matrix[i][j] = 1,dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;
// matrix[i][j] = 0,dp[i][j]=0;
public class Solution {
/**
* 最大正方形
* @param matrix char字符型二维数组
* @return int整型
*/
public int solve (char[][] matrix) {
// write code here
int len1 = matrix.length;//二维数组的一维长度
//特殊值(空数组)处理
if(len1 == 0){
return 0;
}
int len2 = matrix[0].length;//二维数组的二维长度
//特殊值(空数组)处理
if(len2 == 0){
return 0;
}
//特殊值(最大正方形面积为1)处理
if(len1==1 || len2==1){
for(int i=0;i<len1;i++){
for(int j=0;j<len2;j++){
if(matrix[i][j] == '1'){
return 1;
}
}
}
}
int[][] dp = new int[len1][len2];//二维dp数组,其中dp[i][j]表示的是在矩阵中以坐标(i,j)为右下角的最大正方形边长
//初始化第一列
for(int i=0;i<len1;i++){
if(matrix[i][0] == '1'){
dp[i][0] = 1;
}else{
dp[i][0] = 0;
}
}
//初始化第一行
for(int i=0;i<len2;i++){
if(matrix[0][i] == '1'){
dp[0][i] = 1;
}else{
dp[0][i] = 0;
}
}
int max = 1;//最大正方形的边长
//从第二行,第二列开始遍历
for(int i=1;i<len1;i++){
for(int j=1;j<len2;j++){
if(matrix[i][j] == '1'){
//此处体现了动态规划思想,
//递推关系式:matrix[i][j] = 1,dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;
// matrix[i][j] = 0,dp[i][j]=0;
dp[i][j] = Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
if(dp[i][j] > max){
max = dp[i][j];
}
}else{
dp[i][j] = 0;
}
}
}
return max*max;
}
}