力扣周赛292--第四题

2267. 检查是否有合法括号字符串路径

题目

一个括号字符串是一个 非空 且只包含 '('')' 的字符串。如果下面 任意 条件为 ,那么这个括号字符串就是 合法的

  • 字符串是 ()
  • 字符串可以表示为 ABA 连接 B),AB 都是合法括号序列。
  • 字符串可以表示为 (A) ,其中 A 是合法括号序列。

给你一个 m x n 的括号网格图矩阵 grid 。网格图中一个 合法括号路径 是满足以下所有条件的一条路径:

  • 路径开始于左上角格子 (0, 0)
  • 路径结束于右下角格子 (m - 1, n - 1)
  • 路径每次只会向 或者向 移动。
  • 路径经过的格子组成的括号字符串是 合法 的。

如果网格图中存在一条 合法括号路径 ,请返回 true ,否则返回 false

示例 1:

  
输入:grid = [["(","(","("],[")","(",")"],["(","(",")"],["(","(",")"]]  
输出:true  
解释:上图展示了两条路径,它们都是合法括号字符串路径。  
第一条路径得到的合法字符串是 "()(())" 。  
第二条路径得到的合法字符串是 "((()))" 。  
注意可能有其他的合法括号字符串路径。  

示例 2:

  
输入:grid = [[")",")"],["(","("]]  
输出:false  
解释:两条可行路径分别得到 "))(" 和 ")((" 。由于它们都不是合法括号字符串,我们返回 false 。  

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 100
  • grid[i][j] 要么是 '(' ,要么是 ')'

思路

从左上角到右下角,依次路过,下一个坐标一定是该坐标的右侧或者下侧的坐标,同时玩吗记录下路过到该坐标时未配对的’'('的个数,如果是负数则这条路不对旧不用继续下去了。然后一直到右下角的时候,如果个数为1,则满足条件

代码

Java

class Solution {
    public boolean hasValidPath(char[][] grid) {
        xl = grid.length;
        yl = grid[0].length;
        use = new boolean[xl][yl][xl * yl];
        if ((xl + yl) % 2 == 0 || grid[0][0] == ')' || grid[xl - 1][yl - 
            return false;
        }
        dfs(grid, 0, 0, 0);
        return bl;
    }
    int xl;
    int yl;
    boolean bl = false;
    boolean[][][] use;
    private void dfs(char[][] grid, int x, int y, int cnt) {
        if (x >= xl || y >= yl || cnt > xl - x + yl - y - 1) {
            return;
        }
        if (x == xl - 1 && y == yl - 1) {
            bl = cnt == 1;
        }
        if (use[x][y][cnt]) {
            return;
        }
        use[x][y][cnt] = true;
        cnt += grid[x][y] == '(' ? 1 : -1;
        if (cnt < 0) {
            return;
        }
        if (!bl) {
            dfs(grid, x + 1, y, cnt);
        }
        if (!bl) {
            dfs(grid, x, y + 1, cnt);
        }
    }
}