前言
今日的每日一题晚更了,实在是博主能力有限,但是博主可能会迟到,但永远不会缺席!所以,我来了.今天给大家打卡的是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:每日毒鸡汤:哪有什么孤独,不就是没人爱吗?哪有什么寂寞,不就是闲的吗?哪有什么绝望,不就是穷的吗?