私はこのコードをLeetCodeから練習して、C++でうまくいくようにしています。残念ながら、私は '見つける'を正しく動作させることができません。
このコードは二度同じ文字を訪問することなく、タイプCHAR(すなわちボード)のベクトルのベクトルからワードを検索するために使用される(visitedSoFarは、xを追跡し、文字visitedSoFarのY位置)。
クラスノードのベクトルは、これまで訪問した位置を格納するために使用されます。
は、ここで私が書いたコードスニペットです:私は検索をコメントした場合カスタムクラスベクトルで検索する
class Node{
private:
int x;
int y;
public:
Node(int a, int b):x(a),y(b){};
bool operator==(Node newNode){
if(this->x == newNode.x && this->y == newNode.y)
return true;
else
return false;
}
};
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
vector <Node> visitedSoFar;
for(int r =0; r< board.size(); r++){
for(int c=0; c<board[r].size(); c++){
if(board[r][c] == word.at(0)){
if(search(board, word, visitedSoFar, board[r].size(), r, c))
return true;
}
}
}
return false;
}
private:
bool search(vector<vector<char>>& board, string word, vector<Node>& visitedSoFar, int size, int r, int c){
Node newNode(r,c);
visitedSoFar.push_back(newNode);
if(word.size() == 1)
return true;
Node toSearch1(r-1,c);
if(r-1 >= 0 && find(visitedSoFar.begin(), visitedSoFar.end(), toSearch1) == visitedSoFar.end()){
if(board[r-1][c] == word.at(1))
if(search(board, word.substr(1), visitedSoFar, size, r-1, c))
return true;
}
Node toSearch2(r+1,c);
if(r+1 < size && find(visitedSoFar.begin(), visitedSoFar.end(), toSearch2) == visitedSoFar.end()){
if(board[r+1][c] == word.at(1))
if(search(board, word.substr(1), visitedSoFar, size, r+1, c))
return true;
}
Node toSearch3(r,c-1);
if(c-1 >= 0 && find(visitedSoFar.begin(), visitedSoFar.end(), toSearch3) == visitedSoFar.end()){
if(board[r][c-1] == word.at(1))
if(search(board, word.substr(1), visitedSoFar, size, r, c-1))
return true;
}
Node toSearch4(r,c+1);
if(c+1 < size && find(visitedSoFar.begin(), visitedSoFar.end(), toSearch4) == visitedSoFar.end()){
if(board[r][c+1] == word.at(1))
if(search(board, word.substr(1), visitedSoFar, size, r, c+1))
return true;
}
visitedSoFar.pop_back();
return false;
}
};
は、私が正しい出力を得るが、これはすべてのテストケースのために動作しないでしょう。
ありがとうございます。
編集
文は(R + 1)と(c + 1)のためにサイズに対してチェックする場合は修正方法の検索では、。
編集
単語は「隣接」セルが水平方向または垂直方向に隣接するもので順次隣接するセルの文字から構成することができます。同じ文字セルを複数回使用することはできません。
編集
デザインエラー:検索操作は、それに検索を続行する(ノードがこれまでに訪問されていないことを示す)を見つけることができないはずです。したがって、!= visitedSoFar.end()ではなく、== visitedSoar.end()に変更されました。
あなたは 'main'プログラム、テストしているデータ、または期待される出力を教えてくれませんでした。 - *私はこのコード(LeetCodeから)をC++ *でより良くするように練習しています。そして、 "C++のほうが良い"になるためには、デバッガの使い方を学ぶだけでなく、それはうまく動作しない場合は、次に動作します。 – PaulMcKenzie
提案:クラス 'Solution'はあまり意味がなく、状態を保存しません。メソッドはCコードのように見えます。 'class'を' namespace'に変更するか、 'board'と' visitedSoFar'クラスのメンバーにします – xinaiz
c + 1とr + 1> = 0を確認してもよろしいですか?ボードの寸法を超えてチェックしてはいけませんか? c + 1
Ravi