如何移除字符串向量中不符合特定字符位置要求的元素?
实现思路与代码示例
嘿,这个需求其实很清晰,咱们一步步拆解实现它:
核心逻辑是:以向量的第一个字符串为基准模板,找到目标字母在基准中的位置,然后筛选出所有在相同位置上也包含该字母的单词。
步骤拆解
- 边界检查:先处理向量为空的情况,避免后续报错。
- 确定基准位置:从第一个字符串里找出目标字母的位置(可以是所有出现位置,也可以只取第一个,看你具体需求)。如果基准里根本没有这个字母,直接返回空向量就行——毕竟连基准自己都不满足条件,其他单词更不可能符合。
- 筛选符合条件的单词:遍历整个向量,对每个单词做两个检查:
- 单词长度必须和基准一致,防止索引越界;
- 在基准中目标字母的对应位置上,该单词的字符必须等于目标字母。
C++ 代码实现
下面是完整的可运行代码,包含两种常见场景的处理:
场景1:匹配基准中目标字母的所有出现位置
比如如果基准是"YYABC",猜测'Y',那只有前两个字符都是Y的单词才会被保留:
#include <vector> #include <string> #include <iostream> using namespace std; vector<string> filterWordsByAllPositions(const vector<string>& words, char guess) { vector<string> result; if (words.empty()) return result; const string& baseWord = words[0]; vector<size_t> targetPositions; // 收集基准中目标字母的所有位置 for (size_t i = 0; i < baseWord.size(); ++i) { if (baseWord[i] == guess) { targetPositions.push_back(i); } } // 基准里没有目标字母,直接返回空 if (targetPositions.empty()) return result; // 遍历筛选单词 for (const string& word : words) { if (word.size() != baseWord.size()) continue; bool isMatch = true; for (size_t pos : targetPositions) { if (word[pos] != guess) { isMatch = false; break; } } if (isMatch) { result.push_back(word); } } return result; }
场景2:只匹配基准中目标字母的第一个出现位置
这更贴合你给出的例子:基准"CRYPT"里'Y'的第一个位置是索引2,只需要单词在该位置是'Y'就保留:
vector<string> filterWordsByFirstPosition(const vector<string>& words, char guess) { vector<string> result; if (words.empty()) return result; const string& baseWord = words[0]; size_t targetPos = baseWord.find(guess); // 基准里没有目标字母,直接返回空 if (targetPos == string::npos) return result; // 遍历筛选单词 for (const string& word : words) { if (word.size() == baseWord.size() && word[targetPos] == guess) { result.push_back(word); } } return result; }
测试你的示例
用你给出的向量测试第二个函数:
int main() { vector<string> v = { "CRYPT", "CYSTS", "WRYLY", "TRYST" }; vector<string> filtered = filterWordsByFirstPosition(v, 'Y'); // 输出结果:CRYPT WRYLY TRYST for (const string& word : filtered) { cout << word << " "; } return 0; }
额外优化建议
- 如果需要忽略大小写,可以在比较字符时统一转成小写(或大写),比如用
tolower(baseWord[i]) == tolower(guess); - 如果你的单词集合很大,可以考虑提前预处理(比如按字符位置分组),来提升筛选效率。
内容的提问来源于stack exchange,提问作者John Larkos
相关产品推荐
相关产品推荐

