给出一个由小写字母组成的矩阵和一个字典。找出所有同时在字典和矩阵中出现的单词。一个单词可以从矩阵中的任意位置开始,可以向左/右/上/下四个相邻方向移动。
给出矩阵:
doaf
agai
dcan
和字典:
{“dog”, “dad”, “dgdg”, “can”, “again”}
返回 {“dog”, “dad”, “can”, “again”}
#ifndef C132_H
#define C132_H
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Solution {
public:
/**
* @param board: A list of lists of character
* @param words: A list of string
* @return: A list of string
*/
vector<string> wordSearchII(vector<vector<char> > &board, vector<string> &words) {
// write your code here
vector<string> v;
if (board.empty() || words.empty())
return v;
int k = 0;
for (auto c : words)
{
for (int i = 0; i < board.size(); ++i)
{
for (int j = 0; j < board[0].size(); ++j)
{
if (findWord(board, i, j, 0, c))
v.push_back(c);
}
}
}
if (v.empty())
return v;
else
{
words.clear();
words.push_back(v[0]);
for (int k = 0; k < v.size(); ++k)
{
if (v[k] != words.back())
words.push_back(v[k]);
}
return words;
}
}
bool findWord(vector<vector<char>> &v, int i, int j, int pos, string word)
{
if (pos >= word.size())
return true;
if (i < 0 || i >= v.size() || j < 0 || j >= v[0].size() || v[i][j] != word[pos])
return false;
v[i][j] ^= 100;
bool res= findWord(v, i + 1, j, pos + 1, word) | findWord(v, i - 1, j, pos + 1, word) | findWord(v, i, j + 1, pos + 1, word) | findWord(v,i, j - 1, pos + 1, word);
v[i][j] ^= 100;
return res;
}
};
#endif