存在重复字符对;遍历字符串中所有相邻长度为2的子串,用std::unordered_set缓存并检测是否已存在,若count()返回非零则立即返回true。

用 std::unordered_set 检查相邻字符对是否重复
直接判断“字符串中是否存在重复的**字符对**(即连续两个字符组成的子串,如 "ab" 在 "ababc" 中出现两次)”,核心是提取所有长度为 2 的连续子串,并检查是否有重复。最常用且高效的方式是用 std::unordered_set<:string></:string> 缓存已见过的对。
注意:这里“字符对”默认指**相邻、连续、长度为 2** 的子串;不包括间隔字符或反向顺序(如 "ab" 和 "ba" 视为不同)。
- 遍历从索引
0到s.length() - 2,每次取s.substr(i, 2) - 插入
std::unordered_set前先用count()判断是否已存在,存在即返回true - 若字符串长度
,直接返回 <code>false(无法构成字符对)
bool hasRepeatedPair(const std::string& s) {
if (s.length() seen;
for (size_t i = 0; i <h3>用 <code>std::array<bool></bool></code> 优化小写字母场景</h3><p>如果确定输入只含 ASCII 字符(尤其全是小写 <code>'a'</code>–<code>'z'</code>),可以用二维布尔数组代替 <code>std::string</code> 插入,避免内存分配和哈希开销,速度更快、更轻量。</p><p>原理:把字符对 <code>pair[0]</code> 和 <code>pair[1]</code> 映射为整数索引 <code>pair[0] * 256 + pair[1]</code>,覆盖全部 256×256 种组合。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2823" title="C++14"><img
src="https://img.php.cn/upload/manual/001/431/639/6ac8b33c327c4749.png" alt="C++14" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="overflowclass">C++14</a>
<p class="overflowclass">C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。</p>
</div>
<a rel="nofollow" href="/xiazai/gongju/2823" title="C++14" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- 仅适用于已知字符范围窄的场景,否则越界或浪费空间
- 初始化时用
std::array<bool>{}</bool>确保值为false - 检查前先确认两个字符都在有效范围内(如
if (c0 ),避免非法访问
bool hasRepeatedPairASCII(const std::string& s) {
if (s.length() seen = {};
for (size_t i = 0; i <h3>误用 <code>std::set</code> 或未处理边界导致超时或崩溃</h3><p>常见错误不是逻辑错,而是性能或安全疏忽:</p>
- 用
std::set<:string></:string>替代unordered_set:每次插入/查找变成O(log n),总复杂度升到O(n log n),长字符串明显变慢 - 循环写成
i :当 <code>s.length() == 0时,s.length()是无符号类型,减法溢出成极大正数,导致无限循环或越界读 - 用
s[i] + s[i+1]拼接(而非substr):结果是整数加法(ASCII 码相加),不是字符串,必然逻辑错误 - 忽略空字符串或单字符输入,没加
length() 保护,<code>s.substr(0, 2)抛std::out_of_range
需要支持非相邻或可逆字符对?得换思路
如果需求其实是“任意两个位置上的相同字符对”(如 "aba" 中 "a" 和 "a" 构成一对,不管中间隔多远),或者认为 "ab" 和 "ba" 算同一对,那上面所有方案都不适用。
此时应明确问题定义:
- 非相邻对 → 实际是找重复字符(用
std::unordered_map<char int></char>统计频次) - 可逆对(无序)→ 提取每对时先排序两个字符,再存入集合,如
std::minmax(c0,c1)构造键 - 允许重叠但禁止重复索引(如
"aaa"中"aa"出现在位置 0 和 1,是否算两个独立对)→ 需额外规则约束
没有统一解法,关键在先厘清“字符对”的语义边界——工程里多数场景指连续、有序、长度为 2,按第一个方案做即可。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










