We use dynamic programming to solve this.
Space complexity = O(2*n)
Time complexity = O(n^3).
public class maxSquareX { public static void main(String[] args) { char[][] input = { { 'X', '0', 'X', 'X', 'X' }, { 'X', 'X', 'X', 'X', 'X' }, { 'X', 'X', '0', 'X', '0' }, { 'X', 'X', 'X', 'X', 'X' }, { 'X', 'X', 'X', '0', '0' }, }; int[][] rows = new int[input.length][input[0].length]; int[][] cols = new int[input.length][input[0].length]; for (int i = 0; i < input.length; i++) { for (int j = 0; j < input[0].length; j++) { if (input[i][j] == '0') { rows[i][j] = cols[i][j] = 0; } else { rows[i][j] = (i == 0) ? 1 : rows[i - 1][j] + 1; cols[i][j] = (j == 0) ? 1 : cols[i][j - 1] + 1; } } } int max = 1; // since this is the minimum answer we can get int small; // Start from bottom right for (int i = input.length - 1; i >= 0; i--) { for (int j = input[0].length - 1; j >= 0; j--) { small = Math.min(rows[i][j], cols[i][j]); while (small > max) { // we use index [j - small + 1] because small might be // input.length + 1 and when that is subtracted from 'j' we // might get an 'ArrayIndexOutOfBoundsException'. if (small <= rows[i][j - small + 1] && small <= cols[i - small + 1][j]) { max = small; } else small--; } } } } }
Output
3