class Solution {
public int maximalRectangle(char[][] matrix) {
if(matrix.length==0||matrix[0].length==0)
return 0;
int[] heights=new int[matrix[0].length];
int maxArea=0;
Stack<Integer> stack=new Stack<Integer>();
for(int i=0;i<matrix.length;i++)
{
for(int j=0;j<matrix[0].length;j++)
heights[j]=matrix[i][j]=='0'?0:heights[j]+1;
stack.clear();
for(int j=0;j<=matrix[0].length;j++)
{
int h=j==matrix[0].length?0:heights[j];
if(stack.isEmpty()||heights[stack.peek()]<=h)
stack.push(j);
else
{
int idx=stack.pop();
int width=stack.isEmpty()?j:j-stack.peek()-1;
maxArea=Math.max(maxArea, heights[idx]*width);
j--;
}
}
}
return maxArea;
}
}