【Word Search】cpp
题目:
Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
For example,
Given board =
- [
- ["ABCE"],
- ["SFCS"],
- ["ADEE"]
- ]
word = "ABCCED"
, -> returns true
,
word = "SEE"
, -> returns true
,
word = "ABCB"
, -> returns false
.
代码:
- class Solution {
- public:
- bool exist(vector<vector<char> >& board, string word)
- {
- vector<vector<bool> > visited;
- for ( size_t i = ; i < board.size(); ++i )
- {
- vector<bool> tmp(board[i].size(),false);
- visited.push_back(tmp);
- }
- for ( int i = ; i < board.size(); ++i )
- {
- for ( int j = ; j < board[i].size(); ++j )
- {
- if (Solution::dfs(board, visited, i, j, word, )) return true;
- }
- }
- return Solution::dfs(board, visited, , , word, );
- }
- static bool dfs(
- vector<vector<char> >& board,
- vector<vector<bool> >& visited,
- int i,
- int j,
- string& word,
- int curr )
- {
- if ( curr==word.size() ) return true;
- if ( i< || i==board.size() || j< || j==board[i].size() ) return false;
- if ( visited[i][j] ) return false;
- if ( board[i][j]!=word[curr] ) return false;
- if ( board[i][j]==word[curr] )
- {
- visited[i][j] = true;
- if ( Solution::dfs(board, visited, i, j+, word, curr+)) return true;
- if ( Solution::dfs(board, visited, i+, j, word, curr+)) return true;
- if ( Solution::dfs(board, visited, i, j-, word, curr+)) return true;
- if ( Solution::dfs(board, visited, i-, j, word, curr+)) return true;
- }
- visited[i][j] = false;
- return false;
- }
- };
tips:
好好领悟一下dfs吧。。。
1. 这道题在主程序中有一个循环,如果一旦发现word的起点,就从这个位置开始dfs,看能否返回结果。
2. dfs的过程跟模板一样。
shit
============================================
第二次过这道题,逻辑清晰了很多,修正了两个笔误bug,AC了。
- class Solution {
- public:
- bool exist(vector<vector<char> >& board, string word)
- {
- for ( int i=; i<board.size(); ++i )
- {
- for ( int j=; j<board[i].size(); ++j )
- {
- if ( board[i][j]==word[] )
- {
- board[i][j] = '#';
- if ( Solution::dfs(board, i, j, word.substr(,word.size()-)) ) return true;
- board[i][j] = word[];
- }
- }
- }
- return false;
- }
- static bool dfs(
- vector<vector<char> >& board,
- int i, int j,
- string word)
- {
- if ( word.size()== ) return true;
- // left
- if ( j->= && board[i][j-]==word[] )
- {
- board[i][j-] = '#';
- if (Solution::dfs(board, i, j-, word.substr(,word.size()-)) ) return true;
- board[i][j-] = word[];
- }
- // right
- if ( j+<board[].size() && board[i][j+]==word[] )
- {
- board[i][j+] = '#';
- if (Solution::dfs(board, i, j+, word.substr(,word.size()-)) ) return true;
- board[i][j+] = word[];
- }
- // up
- if ( i->= && board[i-][j]==word[] )
- {
- board[i-][j] = '#';
- if (Solution::dfs(board, i-, j, word.substr(,word.size()-)) ) return true;
- board[i-][j] = word[];
- }
- // down
- if ( i+<board.size() && board[i+][j]==word[] )
- {
- board[i+][j] = '#';
- if (Solution::dfs(board, i+, j, word.substr(,word.size()-)) ) return true;
- board[i+][j] = word[];
- }
- return false;
- }
- };
第二次的代码,比第一次过的代码还优化了额外空间结构。O(1)额外空间。
【Word Search】cpp的更多相关文章
- 【word ladder】cpp
题目: Given two words (beginWord and endWord), and a dictionary, find the length of shortest transform ...
- 【Word Break】cpp
题目: Given a string s and a dictionary of words dict, determine if s can be segmented into a space-se ...
- 【word xml】将word转化为xml格式后,如何在xml中卫word添加分页符
1.首先在xml中找到我们需要添加分页符的位置 例如:我需要在这个第一部分上面添加一个分页符 2.找到这个[第一部分]这个位置之后,开始往上找,找到对应的位置 3.在</w:pPr>下方添 ...
- hdu 4739【位运算】.cpp
题意: 给出n个地雷所在位置,正好能够组成正方形的地雷就可以拿走..为了简化题目,只考虑平行于横轴的正方形.. 问最多可以拿走多少个正方形.. 思路: 先找出可以组成正方形的地雷组合cnt个.. 然后 ...
- Hdu 4734 【数位DP】.cpp
题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~ ...
- 【Text Justification】cpp
题目: Given an array of words and a length L, format the text such that each line has exactly L charac ...
- 【Merge Intervals】cpp
题目: Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6], ...
- 【Insert Interval】cpp
题目: Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if nec ...
- 【Edit Distance】cpp
题目: Given two words word1 and word2, find the minimum number of steps required to convert word1 to w ...
随机推荐
- 私有npm下载资源
私有npm库下载资源需要用户名和密码,这个需要创建npm库的人提供. 使用方法: npm login --registry=仓库地址 Username: 用户名 Password: 密码 Email: ...
- NC57访问报错:java.sql.SQLException: Io 异常: Got minus one from a read call
一.报错信息 1. 前端登录界面 2. 后台应用日志 报错信息一致为: $$callid= $$thread=[Service Monitor and Runtime Enroment] $$ho ...
- HttpURLConnection(http 1.1) 用法、状态码、状态描述
最近研究了java的HttpURLConnection的用法, 这里简单的做一下记录: Java中可以使用HttpURLConnection来请求WEB资源. 1. URL请求的类别 分为二类,GET ...
- C#执行异步操作的几种方式比较和总结(转发:https://www.cnblogs.com/durow/p/4826653.html)
0x00 引言 之前写程序的时候在遇到一些比较花时间的操作例如HTTP请求时,总是会new一个Thread处理.对XxxxxAsync()之类的方法也没去了解过,倒也没遇到什么大问题.最近因为需求要求 ...
- Zabbix邮件报警设置方法
实现目的: 在Zabbix服务端设置邮件报警,当被监控主机宕机或者达到触发器预设值时,会自动发送报警邮件到指定邮箱. 具体操作: 以下操作在Zabbix监控服务端进行 备注:Zabbix监控服务端 操 ...
- 如何查看与显示oracle表的分区信息
显示分区表信息 显示数据库所有分区表的信息:DBA_PART_TABLES 显示当前用户可访问的所有分区表信息:ALL_PART_TABLES 显示当前用户所有分区表的信息:USER_PART_TAB ...
- 05、Win7上openSSH的安装与配置
05.Win7上openSSH的安装与配置 1.概述 linux上的ssh命令在网络通信场景下非常方便.现在windows也支持ssh方式和远程主机进行访问.如果只是使用ssh简单的访问功能,就需要很 ...
- 又一例网卡mtu值引发的问题
通过php上传文件到云存储,很小的文件都无法上传,在别的服务器上测试可以,本机环境是ESXI虚机安装的centos 7版本 解决思路过程 1.让开发写一个单独测试上传的文件,不调php nginx配置 ...
- php使用GD库实现图片水印和缩略图——生成图片缩略图
今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...
- 【文件拷贝】使用Total Commander Portable拖动拷贝文件,支持队列
使用Total Commander Portable,可以批量拷贝多个位于相同或不同目录的文件(夹)到指定的相同或不同的目录.这样避免了同时复制多个大的文件造成的速度减慢:将所有任务手动操作之后,剩下 ...