每日三题-子集、单词搜索、删除无效的括号

简介: 每日三题子集单词搜索删除无效的括号

子集


a35f6c20631d4d9184a2f4e04ffe793e.png


解法一

递归+回溯

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        dfs(res,list,nums,0);
        return res;
    }
    public void dfs(List<List<Integer>> res,List<Integer> list,int[] nums,int start){
        if(start > nums.length) return;
        else{
            res.add(new ArrayList(list));
        }
        for(int i = start;i < nums.length;i++){
            list.add(nums[i]);
            dfs(res,list,nums,i+1);
            list.remove(list.size()-1);
        } 
    }
}


单词搜索


672464ae4f3243c6872cfff4fd7d1536.png

解法一

递归+回溯

class Solution {
    public boolean exist(char[][] board, String word) {
        boolean visited[][] = new boolean[board.length][board[0].length];
        for(int i = 0;i < board.length;i++){
            for(int j = 0;j < board[0].length;j++){
                if(dfs(board,word,0,visited,i,j)){
                    return true;
                }
            }
        }
        return false;
    }
    // idx 为需要找的word的下标
    // visited 为是否访问过
    // i,j为当前访问元素的行与列下标
    public boolean dfs(char[][] board,String word,int idx,boolean[][] visited,int i,int j){
        if(idx == word.length()-1 && board[i][j] == word.charAt(idx)) return true;
        if(i > board.length || j > board[0].length || i < 0 || j < 0) return false;
        int[][] dirs = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
        if(board[i][j] != word.charAt(idx)) return false;
        for(int[] dir:dirs){
            visited[i][j] = true;
            int newi = i + dir[0];
            int newj = j + dir[1];
            if(newi >=0 && newi < visited.length && newj >= 0 && newj < visited[0].length){
                if(!visited[newi][newj]){
                    if(dfs(board,word,idx+1,visited,newi,newj)){
                        return true;
                    }
                }
            } 
            visited[i][j] = false;
        }
        return false;
    }
}


删除无效的括号


905fac0049284a3c9ad4b34a64d4f4eb.png

解法一

class Solution {
    public List<String> removeInvalidParentheses(String s) {
        int leftRemove = 0;
        int rightRemove = 0;
        // 找到左右括号删除最小的数量
        for(int i = 0;i < s.length();i++){
            if(s.charAt(i) == '('){
                leftRemove++;
            }
            if(s.charAt(i) == ')'){
                if(leftRemove == 0){
                    rightRemove++;
                }else{
                    leftRemove--;
                }
            }
        }
        List<String> res = new ArrayList<>();
        dfs(res,s,leftRemove,rightRemove,0);
        return res;
    }
    public void dfs(List<String> res,String str,int leftRemove,int rightRemove,int idx){
        if(leftRemove == 0 && rightRemove == 0){
            if(isYouXiaoKuoHao(str)){
                res.add(str);
            }
            return;
        }
        for(int i = idx;i < str.length();i++){
            if(i > 0 && str.charAt(i) == str.charAt(i-1)) continue;
            //删除左括号
            if(leftRemove > 0 && str.charAt(i) == '('){
                dfs(res,str.substring(0,i)+str.substring(i+1),leftRemove-1,rightRemove,i);
            }
            //删除右括号
            if(rightRemove > 0 && str.charAt(i) == ')'){
                dfs(res,str.substring(0,i)+str.substring(i+1),leftRemove,rightRemove-1,i);
            }
        }
    }
    public boolean isYouXiaoKuoHao(String s){
        int left = 0,right = 0;
        for(int i = 0;i < s.length();i++){
            if(s.charAt(i) == '('){
                left++;
            }
            if(s.charAt(i) == ')'){
                right++;
                if(right > left) return false;
            }
        }
        if(left != right) return false;
        return true;
    }
}
相关文章
|
6月前
【每日一题Day130】LC1255得分最高的单词集合 | 回溯
【每日一题Day130】LC1255得分最高的单词集合 | 回溯
45 0
|
6月前
|
算法
算法编程(二十五):检查单词是否为句中其他单词的前缀
算法编程(二十五):检查单词是否为句中其他单词的前缀
60 0
|
6月前
|
算法 测试技术 编译器
【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
题目描述 题目 在字符矩阵中查找给定字符串的所有匹配项 给定一个M×N字符矩阵,以及一个字符串S,找到在矩阵中所有可能的连续字符组成的S的次数。所谓的连续字符,是指一个字符可以和位于其上下左右,左上左下,右上右下8个方向的字符组成字符串。用回溯法求解。
95 1
|
5月前
|
算法 Java
力扣经典150题第二十三题:找出字符串中第一个匹配项的下标
力扣经典150题第二十三题:找出字符串中第一个匹配项的下标
26 0
|
6月前
leetcode代码记录(第一个出现两次的字母
leetcode代码记录(第一个出现两次的字母
32 2
|
存储 Cloud Native Go
【刷题日记】1455. 检查单词是否为句中其他单词的前缀
【刷题日记】1455. 检查单词是否为句中其他单词的前缀
108 1
|
6月前
|
人工智能 自然语言处理 算法
【动态规划】【字符串】【前缀和】1639通过给定词典构造目标字符串的方案数
【动态规划】【字符串】【前缀和】1639通过给定词典构造目标字符串的方案数
|
6月前
|
索引 Python C++
C/C++每日一练(20230418) 搜索插入位置、最长有效括号、子集
C/C++每日一练(20230418) 搜索插入位置、最长有效括号、子集
64 0
C/C++每日一练(20230418) 搜索插入位置、最长有效括号、子集
|
6月前
|
Rust Java Go
Rust每日一练(Leetday0027) 单词搜索、删除重复项II、搜索旋转排序数组II
Rust每日一练(Leetday0027) 单词搜索、删除重复项II、搜索旋转排序数组II
59 0
Rust每日一练(Leetday0027) 单词搜索、删除重复项II、搜索旋转排序数组II
|
6月前
|
算法 Java C++
实现一个单词搜索游戏,给定一个二维网格和一个单词列表,找到单词列表中出现在网格中的所有单词(提示:Trie树 + DFS)。
实现一个单词搜索游戏,给定一个二维网格和一个单词列表,找到单词列表中出现在网格中的所有单词(提示:Trie树 + DFS)。
33 0