leetcode 3212. 统计 X 和 Y 频数相等的子矩阵数量 中等

给你一个二维字符矩阵 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 <= 1000
  • grid[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;
}
相关推荐
失去的青春---夕阳下的奔跑8 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
m0_629494739 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
吃着火锅x唱着歌11 小时前
LeetCode 1019.链表中的下一个更大节点
算法·leetcode·链表
凌波粒12 小时前
LeetCode--404.左叶子之和(二叉树)
算法·leetcode·职场和发展
绝知此事12 小时前
【算法突围 03】核心算法思想:分治/递归/动态规划与 LeetCode 高频真题解析
算法·leetcode·面试·动态规划
阿Y加油吧13 小时前
两道字符串 DP 模板题复盘:最长公共子序列 & 编辑距离
leetcode
我爱cope14 小时前
【力扣hot100:76. 最小覆盖子串】
算法·leetcode·职场和发展
sheeta199814 小时前
LeetCode 每日一题笔记 日期:2026.05.20 题目:2657. 找到前缀公共数组
笔记·算法·leetcode
吃着火锅x唱着歌15 小时前
LeetCode 962.最大宽度坡
算法·leetcode·职场和发展
凌波粒15 小时前
LeetCode--257. 二叉树的所有路径(二叉树)
算法·leetcode·职场和发展