如何检测用户输入字符串是否包含字符串数组中的元素?
非精确姓名匹配的优化实现方案
针对你提到的禁用姓名数组匹配需求,这里提供几个无需手动遍历字符的优化方案,利用C++标准库或数据结构实现高效的前缀匹配:
方案1:利用字符串前缀匹配(std::string::find)
核心思路是检查用户输入的字符串是否以禁用数组中的某个姓名作为前缀,直接使用C++字符串的find方法即可实现,代码简洁高效。
#include <iostream> #include <string> using namespace std; int main() { string ban[3] = {"Ben", "Lina", "Adam"}; string userInput; cout << "请输入姓名:"; cin >> userInput; bool matched = false; string matchedName; // 遍历禁用姓名数组 for (const string& name : ban) { // 检查用户输入是否以当前姓名开头(find返回0表示匹配起始位置) if (userInput.find(name) == 0) { matched = true; matchedName = name; break; } } if (matched) { cout << "匹配到禁用姓名:" << matchedName << endl; } else { cout << "未匹配到禁用姓名" << endl; } return 0; }
此方案依赖标准库优化过的字符串查找逻辑,无需手动处理字符遍历,适合小型禁用列表场景。
方案2:正则表达式匹配(std::regex)
如果后续需要扩展匹配规则(比如支持姓名在输入中间等场景),可以使用正则表达式实现前缀匹配,灵活性更强。
#include <iostream> #include <string> #include <regex> using namespace std; int main() { string ban[3] = {"Ben", "Lina", "Adam"}; string userInput; cout << "请输入姓名:"; cin >> userInput; bool matched = false; string matchedName; for (const string& name : ban) { // 构造前缀匹配正则:^表示行首,匹配以当前姓名开头的字符串 regex pattern("^" + name); if (regex_search(userInput, pattern)) { matched = true; matchedName = name; break; } } if (matched) { cout << "匹配到禁用姓名:" << matchedName << endl; } else { cout << "未匹配到禁用姓名" << endl; } return 0; }
注意:正则表达式会带来轻微的性能开销,若仅需前缀匹配,方案1更轻量。
方案3:前缀树(Trie)优化(适合大量禁用姓名场景)
如果禁用姓名列表数量很大,前缀树可以将查询效率优化到O(n)(n为用户输入字符串长度),避免遍历整个禁用数组。
#include <iostream> #include <string> #include <cstring> using namespace std; // 前缀树节点结构 struct TrieNode { bool isEnd; TrieNode* children[26]; TrieNode() : isEnd(false) { memset(children, 0, sizeof(children)); } }; // 插入姓名到前缀树 void insert(TrieNode* root, const string& name) { TrieNode* node = root; for (char c : name) { // 转小写实现大小写不敏感匹配(可选) int idx = tolower(c) - 'a'; if (!node->children[idx]) { node->children[idx] = new TrieNode(); } node = node->children[idx]; } node->isEnd = true; } // 检查用户输入是否包含禁用姓名前缀 string checkPrefix(TrieNode* root, const string& input) { TrieNode* node = root; string matched; for (char c : input) { int idx = tolower(c) - 'a'; if (!node->children[idx]) { break; } node = node->children[idx]; matched += c; // 找到完整的禁用姓名前缀 if (node->isEnd) { return matched; } } return ""; } int main() { string ban[3] = {"Ben", "Lina", "Adam"}; TrieNode* root = new TrieNode(); // 初始化前缀树 for (const string& name : ban) { insert(root, name); } string userInput; cout << "请输入姓名:"; cin >> userInput; string matchedName = checkPrefix(root, userInput); if (!matchedName.empty()) { cout << "匹配到禁用姓名:" << matchedName << endl; } else { cout << "未匹配到禁用姓名" << endl; } // 注意:实际使用时需释放前缀树内存,此处省略 return 0; }
此方案适合禁用姓名数量较多的场景,单次查询效率更高,但实现相对复杂,小型列表无需使用。
内容的提问来源于stack exchange,提问作者user25400560
相关产品推荐
相关产品推荐

