Prefix Sum VI: DP-like solution
You can think of the solution to this problem in two ways: either a prefix sum, or a Dynamic Programming where you're solving the problem for the {r-1, c}, {r, c-1} and {r-1,c-1} and using those solutions to solve the problem for {r,c}. Code is down below, cheers, ACC.
Count Submatrices With Equal Frequency of X and Y - LeetCode
Given a 2D character matrix grid, where grid[i][j] is either 'X', 'Y', or '.', return the number of submatrices that contains:
grid[0][0]- an equal frequency of
'X'and'Y'. - at least one
'X'.
Example 1:
Input: grid = [["X","Y","."],["Y",".","."]]
Output: 3
Explanation:

Example 2:
Input: grid = [["X","X"],["X","Y"]]
Output: 0
Explanation:
No submatrix has an equal frequency of 'X' and 'Y'.
Example 3:
Input: grid = [[".","."],[".","."]]
Output: 0
Explanation:
No submatrix has at least one 'X'.
Constraints:
1 <= grid.length, grid[i].length <= 1000grid[i][j]is either'X','Y', or'.'.
public class Solution {
public class CellXY
{
public int x = 0;
public int y = 0;
}
public int NumberOfSubmatrices(char[][] grid)
{
CellXY[][] cellXY = new CellXY[grid.Length][];
for (int r = 0; r < grid.Length; r++) cellXY[r] = new CellXY[grid[r].Length];
cellXY[0][0] = new CellXY();
cellXY[0][0].x = (grid[0][0] == 'X') ? 1 : 0;
cellXY[0][0].y = (grid[0][0] == 'Y') ? 1 : 0;
int retVal = 0;
for (int r = 0; r < grid.Length; r++)
{
for (int c = 0; c < grid[r].Length; c++)
{
if (r == 0 && c == 0) continue;
cellXY[r][c] = new CellXY();
cellXY[r][c].x = (grid[r][c] == 'X') ? 1 : 0;
cellXY[r][c].y = (grid[r][c] == 'Y') ? 1 : 0;
if (r - 1 >= 0)
{
cellXY[r][c].x += cellXY[r - 1][c].x;
cellXY[r][c].y += cellXY[r - 1][c].y;
}
if (c - 1 >= 0)
{
cellXY[r][c].x += cellXY[r][c - 1].x;
cellXY[r][c].y += cellXY[r][c - 1].y;
}
if (r - 1 >= 0 && c - 1 >= 0)
{
cellXY[r][c].x -= cellXY[r - 1][c - 1].x;
cellXY[r][c].y -= cellXY[r - 1][c - 1].y;
}
if (cellXY[r][c].x > 0 && cellXY[r][c].x == cellXY[r][c].y) retVal++;
}
}
return retVal;
}
}
Comments
Post a Comment