C++在做递归回溯算法相关题目时,递归函数形参传值和传引用运行速度有很大的差异。
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
if(board.empty()||word.empty())
return false;
for(int i=0; i<board.size(); ++i)
{
for(int j=0; j<board[0].size(); ++j)
{
// 使用回溯法解题
if(dfs(board, word, i, j, 0)) return true;
}
}
return false;
}
bool dfs(vector<vector<char>>& board, string& word, int i, int j, int w)
{
// 如果索引越界,或者值不匹配,返回false
if(i<0 || i>=board.size() || j<0 || j>=board[0].size() || board[i][j]!=word[w]) return false;
if(w == word.length() - 1) return true;
char temp = board[i][j];
board[i][j] = '0'; // 将当前元素标记为'\0',即一个不可能出现在word里的元素,表明当前元素不可再参与比较
if(dfs(board,word,i-1,j,w+1)
||dfs(board,word,i+1,j,w+1)
||dfs(board,word,i,j-1,w+1)
||dfs(board,word,i,j+1,w+1))
{
// 当前元素的上下左右,如果有匹配到的,返回true
return true;
}
board[i][j] = temp; // 将当前元素恢复回其本身值
return false;
}
};
感觉最近状态不是很好,到了这回真的熬不太住了,脑子昏昏沉沉的,明天得准备点咖啡之类的。
效率太低了。增强自觉性!!!
昨天面了深信服,主要问了问项目,tcpip握手分手,为什么分手多一次,冒泡排序,冒泡排序优化
C++11特性、象棋中固定起点和重点,让马去跳,最少几步能到达终点。大概记得这些,之后就直接感谢您参与这次面试,祝您生活越快。太真实了,也挺好,要挂直接挂,不跟你多墨迹。

京公网安备 11010502036488号