Aを考える pattern
と、文字列の str
場合は、見つける str
と同じパターンに従います。
ここでのフォローは、内の文字の間に全単射が存在するように、完全な一致を意味 pattern
し、非空の言葉 str
。
例1:
入力:パターン="abba"
、STR ="dog cat cat dog"
出力:真
例2:
入力:パターン="abba"
、STR ="dog cat cat fish"
出力:偽
例3:
入力:パターン="aaaa"
、STR ="dog cat cat dog"
出力:偽
例4:
入力:パターン="abba"
、STR ="dog dog dog dog"
出力:偽
効果の対象:
二つの文字列strのパターンを考えると、与えられたルールパターンに応じて、strがまた、このルールに従うかどうかを決定します。
理解:
これは間違っている、ちょうどこのパターンはまだ合同であるとして例のトピックが誤解判断させていただきます参照してください。
実際には、このトピックと同様のトピックを置き換えるために、文字列の前に。しかし、ここでの単語置換文字です。
文字や単語のマッピング関係マップを保存します。セーブセット言葉と同じ言葉にマッピングされた別の文字に対してマッピングされています。
STR第1のベクトルの長さと等しくないサイズのパターンは、偽が戻されるベクトルを分割ワードに格納されています。
パターンを横切る、現在の文字パターンがない場合は、[i]は、発生した対応する単語があるか否かを判断するには偽である、そうでない場合、マップは、マップに追加されます。
現在の文字パターン[i]が発生した場合の単語が現在の単語に対応し、マップマップは、同一のトラバースを続けるかどうか、それ以外の場合はfalseを返し、決定します。
コードC ++:
クラス解決{ パブリック: BOOL wordPattern(文字列パターン、文字列STR){ ベクトル < ストリング > splitWords; // STRワードに分割 INT = startPos 0、blankPos; //は、単語の録音、空間の位置の位置開始 文字列 Wordを; / / ストア・ワード 地図 < 文字、文字列 >メートル; //は、二つの文字列間のマッピング保存 地図< 文字を、文字列 > :: ITをイテレータ; SET <文字列 > m_set; // 同じワードにマッピングされた複数の文字防ぐ のint i = 0 ; // トラバース しながら((blankPos = str.find(' '!、startPos))= str.npos){ ワード = str.substrを( startPos、startPos-blankPos); //は、位置と長さ開始 splitWords.push_back(ワード); startPosの =のblankPos + 1 ; } // プロセスの最後のワード IF(startPos < str.length()){ ワード = str.substr (startPos); splitWords.push_back(ワード)。 } IF(!pattern.length()= splitWords.size())は 返す 偽。 一方、(!パターン[I] = ' \ 0 ' ){ それは = m.find(パターン[I])を、 もし(それ== m.end()){ 場合(m_set.find(splitWords [I])== m_set.end()){ m_set.insert(splitWords [I])。 } 他{ 戻り 偽。 } m.insert(対 < 文字、文字列 >(パターン[I]、splitWords [I]))。 I ++ ; } 他{ 場合(のstrcmp((IT->秒).c_str()、splitWords [I] .c_str())== 0 ) I ++ 。 それ以外の 返し はfalse ; } } 戻り 真。 } }。
結果:
ときに実行:4つのMSは、Cに提出するすべてのユーザーの94.12パーセントを打つ++
メモリ消費量:8.9メガバイトは、Cに提出するすべてのユーザの5.10パーセントを打つ++