You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除字符串向量中不符合特定字符位置要求的元素?

实现思路与代码示例

嘿,这个需求其实很清晰,咱们一步步拆解实现它:

核心逻辑是:以向量的第一个字符串为基准模板,找到目标字母在基准中的位置,然后筛选出所有在相同位置上也包含该字母的单词。

步骤拆解

  1. 边界检查:先处理向量为空的情况,避免后续报错。
  2. 确定基准位置:从第一个字符串里找出目标字母的位置(可以是所有出现位置,也可以只取第一个,看你具体需求)。如果基准里根本没有这个字母,直接返回空向量就行——毕竟连基准自己都不满足条件,其他单词更不可能符合。
  3. 筛选符合条件的单词:遍历整个向量,对每个单词做两个检查:
    • 单词长度必须和基准一致,防止索引越界;
    • 在基准中目标字母的对应位置上,该单词的字符必须等于目标字母。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:35:18