题目要求:
分析:
看到这道题目的第一反应是用DFS,可是在边界的时候不好处理。这个正方形的面积肯定与它之前取的边长值有关,那么我们就利用动态规划来解决。
用dp[i][j]来表示最长边长,此时的dp[i][j]可以想象成位于一个正方形的右下角,那么它的边长就与它的左边,上面,和左上面有关。要求正方形边长,就要求出这三个边长的最小值,并加上此时dp[i][j]的边长1即可。
具体代码如下:
class Solution {
public int maximalSquare(char[][] matrix) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
return 0;
int m = matrix.length, n = matrix[0].length;
int[][] dp = new int[m + 1][n + 1];
int len = 0;
for(int i = 1; i <= m; i ++) {
for(int j = 1; j <= n; j ++) {
if(matrix[i - 1][j - 1] == '1') {
dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
len = Math.max(len, dp[i][j]);
}
}
}
return len * len;
}
}