给你一个二维字符矩阵 grid,其中 grid[i][j] 可能是 'X'、'Y' 或 '.',返回满足以下条件的子矩阵数量:
- 包含
grid[0][0] 'X'和'Y'的频数相等。- 至少包含一个
'X'。
示例 1:
输入: grid = [["X","Y","."],["Y",".","."]]
输出: 3
解释:

示例 2:
输入: grid = [["X","X"],["X","Y"]]
输出: 0
解释:
不存在满足 'X' 和 'Y' 频数相等的子矩阵。
示例 3:
输入: grid = [[".","."],[".","."]]
输出: 0
解释:
不存在满足至少包含一个 'X' 的子矩阵。
提示:
1 <= grid.length, grid[i].length <= 1000grid[i][j]可能是'X'、'Y'或'.'.
分析:二维前缀和。用一个数组记录以当前位置为右下角的矩阵中,包含的 X 和 Y 的数量,当这两个值先等且不为 0 时,说明这个子矩阵符合要求。检查所有点,统计符合要求的点的数量。
cpp
typedef struct node
{
int x,y;
}node;
int numberOfSubmatrices(char** grid, int gridSize, int* gridColSize) {
int n=gridSize,m=gridColSize[0];
node cnt[n+5][m+5];cnt[0][0].x=cnt[0][0].y=0;
if(grid[0][0]=='X')cnt[0][0].x=1;
else if(grid[0][0]=='Y')cnt[0][0].y=1;
for(int i=1;i<n;++i)
{
cnt[i][0]=cnt[i-1][0];
// cnt[i][0].x=cnt[i-1][0].x,cnt[i][0].y=cnt[i-1][0].y;
if(grid[i][0]=='X')cnt[i][0].x+=1;
else if(grid[i][0]=='Y')cnt[i][0].y+=1;
}
for(int j=1;j<m;++j)
{
cnt[0][j]=cnt[0][j-1];
// cnt[0][j].x=cnt[0][j].x,cnt[0][j-1].y=cnt[0][j-1].y;
if(grid[0][j]=='X')cnt[0][j].x+=1;
else if(grid[0][j]=='Y')cnt[0][j].y+=1;
}
for(int i=1;i<n;++i)
for(int j=1;j<m;++j)
{
cnt[i][j].x=cnt[i-1][j].x+cnt[i][j-1].x-cnt[i-1][j-1].x;
cnt[i][j].y=cnt[i-1][j].y+cnt[i][j-1].y-cnt[i-1][j-1].y;
if(grid[i][j]=='X')cnt[i][j].x+=1;
else if(grid[i][j]=='Y')cnt[i][j].y+=1;
}
int ans=0;
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
if(cnt[i][j].x&&cnt[i][j].x==cnt[i][j].y)
ans++;
return ans;
}