这题使用动态规划,基本想法是建立一张表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; } };