如何查找字符串是否与数组中找到的字符串匹配

How to find if a string match one found in an array?

本文关键字:字符串 串匹配 字符 数组 是否 何查找 查找      更新时间:2023-10-16
为了

查看给定的字符串是否与数组中的任何字符串匹配,将已知字符串与字符串数组进行比较的最有效方法是什么?

例如:你有

string String1 = "ID5";
string String2 = "ID7";

您想查看它们中的任何一个是否包含在以下

string List[5] = {"ID1", "ID7", "ID10", "ID34", "ID62"}

这样你就可以做到这一点

 if(#STRINGMATCHES) {
    // Do one thing
 }
 else {
    // Do another
 }

通过使用 std::find

std::find(List, List+5, String1)

如果您需要多次执行此搜索操作,这就是我的建议 - 使用一些哈希函数对所有字符串进行哈希处理,然后创建一个包含排序哈希的新数组。然后,当您需要检查数组中是否包含字符串时,请在排序数组中binary_search其哈希值。这将比按照als的建议只做std::find更有效,但取决于你需要执行足够多的搜索操作,以便速度增益弥补排序开销。

如果数组是排序的,您可以使用std::binary_search()

std::string List[] = { "ID1", "ID10", "ID7", "ID34", "ID62" };
if (std::binary_search(std::begin(List), std::end(List), "ID7"))
{
    std::cout << "found stringn";
}

如果没有,则使用std::find()(如Als所述)。

最简单的解决方案是放置您正在寻找的字符串到数组中并使用std::find_first_of

std::string targetList[] = { "ID5", "ID7" };
std::string searchList[] = { "ID1", "ID2", "ID3", "ID4", "ID5" };
if ( std::find_first_of( begin( searchList ), end( searchList ),
                         begin( targetList ), end( targetList ) )
        != end( targetList ) ) {
    //  found...
} else {
    //  not found...
}

这不一定是最有效的解决方案,因为 find_first_of对数据不作任何假设。 如果搜索列表非常大,不会更改,例如,目标列表只包含几个元素,对搜索列表,然后对目标列表中的每个元素进行二分搜索。

我有一个想法。

首先,我们应该使列表排序,就像hmjd描述的那样。

在比较两个字符串时,我们可以记录一些信息。

例如

表二 Dimension 数组 DIF 记录两个字符串不同的索引。

string[2] = {"abc","abd"}
list[5] = {"aab","abb","abc","bcd","ef"}


dif[0][0] = 1 ("abc" and "aab" differ at index 1) 
dif[0][1] = 2 ("abc" and "abb" differ at index 2) 
dif[0][2] = -1 ("abc" and "abc" are same, so we use -1 to represent two strings are same) 
dif[0][3] = 0 ("abc" and "bcd" differ at index 0) 
dif[0][4] = 0 ("abc" and "eg" differ at index 0) 

当我们需要将新字符串与列表中的字符串进行比较时。我们首先在已比较的字符串中找到最相似的字符串。例如,"abd"是判断所需的字符串。我们找到"abc"。"abd"和"abc"在索引2上有所不同。因此,当我们比较"adb"和列表中的字符串时,我们不需要比较索引中与"abc"不同的字符串,而不是2。例如,我们不需要比较"abd"和"ef",因为"abd"在索引2处与"abc"不同,而"abc"在索引0处与"ef"不同。

我的想法非常粗略,有很多细节需要考虑。我认为它很有用,尤其是在大规模问题中。