leetCode_212、单词搜索

前言

今日的每日一题晚更了,实在是博主能力有限,但是博主可能会迟到,但永远不会缺席!所以,我来了.今天给大家打卡的是leetCode上面的212题,单词搜索,是一道定义为困难的题目,本博主也确实感受到他的困难了。(困难的主要原因可能还是我太菜了叭)
卑微

打卡界面如下:
打卡截图

今日运行过程

以往这个是不会分享出来的,但是今天运算过程有点“一眼难尽”就想分享出来卖卖惨,骗骗大家的四连~

运算过程

原题题目

给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。
单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用

题目案例

题目带图,有点大

案例

题目分析

题目大意就是让我们将给定⼀个⼆维⽹格和⼀些单词,找出这些单词中是否有存在于⽹格中,有就需要提出来。我们首先的思路,是怎么来找出这些数据,最开始的思想方式是利用树的形式来对数据进行保存,将每一个字母都作为一个根结点进行存储,在通过指针的方式进行查询与搜索,将判断值返回。嗯~个人觉得可行,可是当我开始做的时,我傻眼了,我不会用Java写树呀!本博主自闭!!!(现在学数据结构也来不及呀,于是就放弃了这种想法。。)然后转链表的形式(链表的形式,查询速度快),我在想这个问题的适合,再看了一眼题目的定义函数,用的是List,那么我需要再定义一个List表用来保存最后的数据,嗯,先定义一个ArrayList表叭。

List<String> ans = new ArrayList<String>();

再一想,既然有那么多单词,肯定是一个一个来比对,嗯,再循环一下所有单词,之后怎么搞呢?在“田字表”上的任意⼀个起点开始,(这里的问题来了,起点,什么时候是起点呢,这个简单,当我们二维数组中存储的字符与一维数组中单词的第一位相同时,就可以了。board[x][y] == str.charAt(0))向 4 个⽅向分别进行搜索,直到所有的单词字⺟都找到了就输出 true,否则输出 false。好像就可以了,那这里的问题就是在于怎么向4个方向进行搜索呢?嗯,就想到了用if语句进行四个方向查询,但是又不能用if else结构,因为并不确定是否可行,所以加一个判断值,如果这一个成功了,就把boolean 改成下面的if(不执行),就有了下面的代码。

		public boolean dfs(char[][] board, String str, int x, int y, int idx){
        char tmp = board[x][y];
        boolean res = false;
        if(board[x][y] == str.charAt(idx)){
            if(idx == str.length() - 1) {
                return true;
            }
            board[x][y] = '\0';
        }else{
            return false;
        }
        if(x - 1 >= 0) {
            res = dfs(board, str, x - 1, y, idx + 1);
        }
        if(x + 1 < board.length && !res) {
            res = dfs(board, str, x + 1, y, idx + 1);
        }
        if(y - 1 >= 0 && !res) {
            res = dfs(board, str, x, y - 1, idx + 1);
        }
        if(y + 1 < board[0].length && !res) {
            res = dfs(board, str, x, y + 1, idx + 1);
        }
        board[x][y] = tmp;
        return res;
    }

最难的都做出来了,就看看代码叭!

代码展示

半成品

第一次暴力循环结束后,好家伙,运行失败:原因,数组输出结果不符。
我的输出
[a, a, a, a, a, a, a, a, a, a, a, a, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aa, aaa, aaa, aaa, aaa, aaa, aaa, aaa, aaa, aaa, aaa, aaa, aaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaa, aaaaa, aaaaa, aaaaa, aaaaa, aaaaa, aaaaa, aaaaa, aaaaa, aaaaa, aaaaa, aaaaa, aaaaa, aaaaaa, aaaaaa, aaaaaa, aaaaaa, aaaaaa, aaaaaa, aaaaaa, aaaaaa, aaaaaa, aaaaaa, aaaaaa, aaaaaa, aaaaaaa, aaaaaaa, aaaaaaa, aaaaaaa, aaaaaaa, aaaaaaa, aaaaaaa, aaaaaaa, aaaaaaa, aaaaaaa, aaaaaaa, aaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa, aaaaaaaaaa];

要求结果
结果

class Solution {
    List<String> ans = new ArrayList<>();
    public List<String> findWords(char[][] board, String[] words) {
        for(String word : words){
            for(int i = 0; i < board.length; i++){
                for(int j = 0; j < board[0].length; j++){
                    if(board[i][j] == word.charAt(0)){
                        boolean res = dfs(board,word,i,j,0);
                        if(res){
                            ans.add(word);
                            break;
                        }
                    }
                }
            }
        }
        return ans;
    }
    public boolean dfs(char[][] board, String str, int x, int y, int idx){
        char tmp = board[x][y];
        boolean res = false;
        if(board[x][y] == str.charAt(idx)){
            if(idx == str.length() - 1){
                return true;
            }   
            board[x][y] = '\0';
        }else{
            return false;
        }
        if(x - 1 >= 0) {
            res = dfs(board, str, x - 1, y, idx + 1);
        }
        if(x + 1 < board.length && !res) {
            res = dfs(board, str, x + 1, y, idx + 1);
        }
        if(y - 1 >= 0 & !res) {
            res = dfs(board, str, x, y - 1, idx + 1);
        }
        if(y + 1 < board[0].length && !res) {
            res = dfs(board, str, x, y + 1, idx + 1);
        }
        board[x][y] = tmp;
        return res;
    }
}

最终代码

发现问题:数据重复,未删除,我的后几次错误都是因为这个,前面几次不是,是其他问题(哈哈,别问,问就是测试),于是赶紧取叭数组改成Set,运行报错(要求数组为List,懂了叭。。。)赶紧换回来,那没办法,暴力整它,用一个循环,把数据自己删除重复数据,也挺简单,遍历一遍,因为同一个单词保存出来的结果肯定保存在相邻的位置,所以假如两个相邻的数据相同时 ,删除其中一个就好啦。(可能投机取巧了,不过不可能出现两个同样的单词并且放在一起去搜索叭,不会这么傻叭,嗯~没这么傻,我整出来了)

最终代码

class Solution {
    List<String> ans = new ArrayList<>();
    public List<String> findWords(char[][] board, String[] words) {
        for(String word : words){
            for(int i = 0; i < board.length; i++){
                for(int j = 0; j < board[0].length; j++){
                    if(board[i][j] == word.charAt(0)){
                        boolean res = dfs(board,word,i,j,0);
                        if(res){
                            ans.add(word);
                            break;
                        }
                    }
                }
            }
        }
        for(int i=0;i< ans.size()-1;i++){
            if(ans.get(i)==ans.get(i+1)){
                ans.remove(i+1);
                i--;
            }
        }
        return ans;
    }
    public boolean dfs(char[][] board, String str, int x, int y, int idx){
        char tmp = board[x][y];
        boolean res = false;
        if(board[x][y] == str.charAt(idx)){
            if(idx == str.length() - 1){
                return true;
            }   
            board[x][y] = '\0';
        }else{
            return false;
        }
        if(x - 1 >= 0) {
            res = dfs(board, str, x - 1, y, idx + 1);
        }
        if(x + 1 < board.length && !res) {
            res = dfs(board, str, x + 1, y, idx + 1);
        }
        if(y - 1 >= 0 & !res) {
            res = dfs(board, str, x, y - 1, idx + 1);
        }
        if(y + 1 < board[0].length && !res) {
            res = dfs(board, str, x, y + 1, idx + 1);
        }
        board[x][y] = tmp;
        return res;
    }
}

LeetCode运行效果截图如下:
运行截图

Ps:每日毒鸡汤:哪有什么孤独,不就是没人爱吗?哪有什么寂寞,不就是闲的吗?哪有什么绝望,不就是穷的吗?

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值