0

好的,我一直在尝试解决我的问题。问题是:给定一个包含 3 个字母的单词列表(我认为列表的大小无关紧要),我如何识别列表中与列表中第一个单词最多相差一个字母的单词。假设我有 pat 这个词,那么我想识别列表中的所有词:

pa_ 如付 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 个所需的测试组合(以相同的顺序)是:

  • p?t 测试在哪里 0x70??74
  • ?在哪里测试是 0x??6174
  • 爸?测试在哪里 0x7061??

PS我可以添加stackoverflow“代码示例”按钮,该按钮假设重新格式化您的选择,因为代码在Firefox中很奇怪。这篇 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/

....或者你可以像 Tony the Lion 所说的那样使用正则表达式。

编辑: ....也是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

还有strstr可以找到 str1 在 str2 中的第一次出现。

例如:

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

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

第二次编辑:

你绝对可以做一个循环

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

//no matches

}

于 2013-03-02T01:17:37.990 回答