0

わかりました、私は自分の問題の解決策を考え出そうとしています。問題は次のとおりです: 3 文字の単語のリストが与えられた場合 (リストのサイズは関係ないと思います)、リスト内の最初の単語と最大 1 文字だけ異なる単語をリスト内で特定するにはどうすればよいでしょうか。pat という単語があるとします。次に、リスト内のすべての単語を特定したいと思います。

pa_ pay など p_t pot _ot rot など

c++ でワイルドカードを実装する方法はありますか?

4

2 に答える 2

0

[これは割り当てが必要とするよりも複雑かもしれませんが、遅い文字列比較と正規表現を回避します]

すべてが 3 文字の単語であることを考えると、各単語を 4 バイトの整数として表すことを検討できます。たとえば、「pat」では、文字「p」は 0x70 (ASCII)、「a」は 0x61、「t」は 0x74 であるため、整数 0x706174 で「pat」を表します。テスト リスト内のすべての 3 文字の単語についても同様に行います。

次に、3 文字のうち 2 文字が (同じ順序で) 一致するために必要なテストの組み合わせは次のとおりです。

  • テストが 0x70??74 である p?t
  • ? テストが 0x??6174 の場所
  • パ?テストは 0x7061 ですか??

PS Firefox では、コードが奇妙であるため、選択内容を再フォーマットすることを想定している stackoverflow の「コード サンプル」ボタンを追加できます。この 1 分間の投稿は、フォーマットに 20 分かかりました。

// assume array words[] of strings
int word0 = calc_int_from_word(words[0]);

for (int ii = 1; ii < words.count; ii++)
{
  int wordii = calc_int_from_word(words[ii]);

  if (wordii & 0xFFFF00 == word0 & 0xFFFF00 ||
      wordii & 0xFF00FF == word0 & 0xFF00FF ||
      wordii & 0x00FFFF == word0 & 0x00FFFF)
  {
    // words[ii] matches words[0] in at least two letters
  }
}
于 2013-03-02T01:48:56.300 に答える
0

strcmp関数と、ここにリストされている他の関連関数のいくつかを見てみてください: http://www.cplusplus.com/reference/cstring/strcmp/

....または、ライオンのトニーが言ったように正規表現を使用することもできます。

編集: .... strcspn関数でもあります

http://www.cplusplus.com/reference/cstring/strcspn/

/* strcspn example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "fcba73";
  char keys[] = "1234567890";
  int i;
  i = strcspn (str,keys);
  printf ("The first number in str is at position %d.\n",i+1);
  return 0;
}

出力:

str の最初の数字は位置 5 にあります

str2 で最初に出現する str1 を見つけるstrstrもあります。

例えば:

 string str1 = "po";
 string str2 = "potlock";

 char * pch;
  pch = strstr (str2,str1);

2番目の編集:

あなたは間違いなくループを行うことができます

if (strcspn (str1,str2)){
    //there is at least one match
}else {

//no matches

}

于 2013-03-02T01:17:37.990 に答える