单词搜索 II-LintCode

来源:互联网 发布:矩阵理论答案 编辑:程序博客网 时间:2024/06/05 13:25

给出一个由小写字母组成的矩阵和一个字典。找出所有同时在字典和矩阵中出现的单词。一个单词可以从矩阵中的任意位置开始,可以向左/右/上/下四个相邻方向移动。
给出矩阵:
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