Leetcode_c++: Word Search (079)
2016-06-06 23:39
841 查看
题目
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 =
[
[‘A’,’B’,’C’,’E’],
[‘S’,’F’,’C’,’S’],
[‘A’,’D’,’E’,’E’]
]
word = “ABCCED”, -> returns true,
word = “SEE”, -> returns true,
word = “ABCB”, -> returns false.
算法
dfsO(n^2m^2)
题意很简单,给你一个二维字母的数组,可以上下左右走,查找是否某个单词是否存在。同一位置的字母不可以被使用多次。
解题思路: 类似于迷宫,递归回溯。需要一个辅助数组记录走过的位置,防止同一个位置被使用多次。
http://www.cnblogs.com/ganganloveu/p/4188131.html
class Solution { private: bool dfs(vector<vector<char> > &board,int x,int y,string word,int idx, vector<vector<bool> > &vis){ if(idx==word.length()) return true; if(x<0 ||x>=board.size()||y<0||y>=board[0].size()||vis[x][y]|| board[x][y]!=word[idx]) return false; vis[x][y]=true; bool ret= dfs(board,x+1,y,word,idx+1,vis)|| dfs(board,x-1,y,word,idx+1,vis)|| dfs(board,x,y+1,word,idx+1,vis)|| dfs(board,x,y-1,word,idx+1,vis); vis[x][y]=false; return ret; } public: bool exist(vector<vector<char> >& board, string word) { if(board.empty()||board[0].empty()) return word==""; int n=board.size(),m=board[0].size(); vector<vector<bool> > vis(n,vector<bool>(m,false)); for(int i=0;i<n;++i) for(int j=0;j<m;++j) if(dfs(board,i,j,word,0,vis)) return true; return false; } };
相关文章推荐
- C++设计模式——单例模式
- C++ 笔记2:重载运算符
- 2016.06.06 周一 C语言 将字符串根据字符的ASCII码从大到小排序并打印出字符串中的字符类型的总数
- 地图分幅计算 之四 新旧图幅号转换及实现(C++)
- 地图分幅计算 之二 新图幅号计算及实现(C++)
- c++实验7-最大公约数与最小公倍数
- 值传递,指针传递;引用传递(c++独有)本质
- Leetcode_c++: Subsets (078)
- c++13周实验:输入/输出流的综合应用
- STL学习系列之一——标准模板库STL介绍
- C++11 std::function、std::bind
- c++:构造与析构函数基本,银行类
- C++中STL常用算法概要
- c++作业七
- C++ 笔记1: 字符串操作1
- C++中类的6个默认成员函数
- C++走向远洋——64(项目三、数组类模板)
- Microsoft Speech Platform SDK,语音识别
- C++回顾(2)——引用
- C++primer第15章习题解答