这题使用动态规划,基本想法是建立一张表table,table[i][j]就标志以点(i, j) 为右下角顶点的正方形最大边长,显然,可以通过table[i - 1][j - 1]来得到

table[i][j]的值(正方形,只需要考虑对角的方向)。

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
            int M = matrix.size();
    if(M == 0)
        return 0;
    int N = matrix[0].size();
    if (N == 0)
        return 0;
    vector<vector<int>> table(M);
    for(int i = 0; i < M; i++)
        table[i].resize(N);
    int maxLen = 0;
    for(int j = 0; j < N; j++){
        if(matrix[0][j] == '0')
            table[0][j] = 0;
        else
            table[0][j]= 1;
        maxLen = max(table[0][j], maxLen);
    }
    for(int i = 0; i < M; i++){
        if(matrix[i][0] == '0'){
            table[i][0]= 0;
        }
        else{
            table[i][0]= 1;
        }
        maxLen = max(table[i][0], maxLen);
    }
    
    for(int i = 1; i < M; i++){
        for(int j = 1; j < N; j++){
            if(matrix[i][j] == '1') {
                int w = 1;
                int h = 1;
                for (int k = 0; k < table[i - 1][j - 1]; k++) {
                    //for all k in line i
                    if(matrix[i][j - 1 - k] == '1')
                        w++;
                    else
                        break;
                }
                for (int k = 0; k < table[i - 1][j - 1]; k++) {
                    // for all k in col j
                    if(matrix[i - 1 - k][j] == '1')
                        h++;
                    else
                        break;
                }
                table[i][j] = min(w, h);
            }
            else{
                table[i][j] = 0;
            }
            maxLen = max(table[i][j], maxLen);
        }
    }
    return maxLen * maxLen;
    }
};