Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过令牌进行字符串匹配-概念检查_C++_Token_String Matching_Extended Ascii - Fatal编程技术网

C++ 通过令牌进行字符串匹配-概念检查

C++ 通过令牌进行字符串匹配-概念检查,c++,token,string-matching,extended-ascii,C++,Token,String Matching,Extended Ascii,此问题用于概念检查。我有一个字符串000.00-010.0.0,我想从列表{000.00-012.0.0.0和000.00-008.0.0}中找到最匹配的字符串000.00-010.0.0(包括编辑度量值和数字距离度量值),我想将“012”、“010”和“008”作为标记并测量它们之间的距离 字符串匹配的标准方法将查找每个字符位置的变化,将这些变化相加并返回一个距离。修改后的距离也将测量字符之间的ASCII距离-G距离E比D远 要衡量“012”与“008”的区别,需要将三个字符捆绑到一个令牌中。

此问题用于概念检查。我有一个字符串000.00-010.0.0,我想从列表{000.00-012.0.0.0和000.00-008.0.0}中找到最匹配的字符串000.00-010.0.0(包括编辑度量值和数字距离度量值),我想将“012”、“010”和“008”作为标记并测量它们之间的距离

字符串匹配的标准方法将查找每个字符位置的变化,将这些变化相加并返回一个距离。修改后的距离也将测量字符之间的ASCII距离-G距离E比D远

要衡量“012”与“008”的区别,需要将三个字符捆绑到一个令牌中。该标记是否可以轻松测量编辑距离和距离?删除树数据库中的分隔符似乎使问题更加复杂

我建议的解决方案是将“012”、“010”和“008”转换为单字符ASCII符号,例如),*、和+,测量字符距离和字符串编辑距离,然后在打印时转换回“012”、“010”和“008”

示例字符串:
MER99.C0.00M.14.006.00.060.350

还有通配符:

  • MER99.*.006.00.060.350
  • MER99.C0.00M.??.006.00.060.350
由于字符串的长度相同(有些字符串的长度需要伪字符,'00M'实际上是'M'),因此匹配的是汉明距离


我不需要关于匹配算法、汉明距离方法、通配符或虚拟字符的帮助,我在问题的上下文中添加了这些。现在,我将令牌作为单独的字符处理,并获得了很好的结果,但我知道它们并不像作为令牌处理那样精确。限制因素可能是编码模式中的不一致性。但是,我希望以此作为限制,而不是我的算法。

您的字符串包含字母数字字符,即以36为基数的数字。此外,这些字符分组在“令牌”中。它不能存储在
char
中,但可以存储在
int

您可以存储一对,而不是在树中存储int,其中char表示值的类型:

  • 0
    用于数值
  • 1
    用于
    *
  • 2
    用于
    xxxx?
    (掩码)
  • 等等

为什么要将“012”、“010”和“008”更改为一个字符?你可以照你说的做,把每个字符的差值相加(绝对值)。。。例如:
'012'-'010':0[代表'0']+0[代表'1']+2[代表'2'和'0']=2
'032'-'020':0[代表'0']+1[代表'3'和'2']+2[代表'2'和'0']!=3
它是12,所以
'+'减去'*'=12
实际上它是12*1;1表示编辑,12表示“leafs”之间的距离,我假设“012”是一个3位十进制数。您不能在单个字符中更改此数字:值将从0变为999,这显然不适合[0;255]。对于12:
100*0[对于“0”和“0”]+10*1[对于“3”和“2”]+1*2[对于“2”和“0”]
为什么转换为int等效值会有帮助?此外,还删除了字符分隔以允许字符串匹配。我想它们可能会留在树中,会有“.”的节点。无需编写代码,我可以编写它。所以你要建立一个int树,然后比较它们是否匹配?有一个问题,我的结构中有一部分是字母数字——为了简化问题,我省略了这个问题。我没有重用ASCII表的“A”到“Z”。我可以将字母char转换成一些有代表性的int,并使用您的方法。我在编辑答案的问题中添加了一个示例字符串。在你的问题中有一些东西是有点不清楚的:树(你刚才提到过),和“编辑距离”。我希望我能更接近你想要的不,我还在努力。我解释得不够好,所以谢谢你的回答。这是一个维基百科页面