动态规划
主要思想是:dp[i][j]是指matrix[i][j]作为右下角时的最大正方形的长度,所以要考虑和它相邻的三个可能扩大后以它作为右下角的正方形的最小长度再加起来,如果是找最大的,扩大后可能里面有空洞。
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.empty()) return 0;
vector<vector<int>>dp(matrix.size(),vector<int>(matrix[0].size(),0));
for(int i = 0;i<matrix.size();i++)
{
for(int j = 0;j<matrix[i].size();j++)
{
dp[i][j] = matrix[i][j] - '0';
}
}
int Max = 0;
for(int i = 0;i<matrix.size();i++)
{
for(int j = 0;j<matrix[i].size();j++)
{
if(dp[i][j] && i-1 >=0 && j-1>=0)
{
dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
}
Max = max(Max,dp[i][j]);
}
}
return Max*Max;
}
};