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

如何获取字符串中所有长度为k的子串?及C++子串提取代码错误排查与修正求助

嘿,我来帮你搞定这两个问题!

问题一:如何获取字符串中所有长度为k的子串?

要拿到字符串里所有长度为k的子串,核心逻辑很清晰:

  • 先确定合法的起始索引范围:起始索引i的最小值是0,最大值是字符串长度 - k(因为从i开始往后数k个字符不能超出字符串边界)。
  • 对每个合法的起始索引i,直接截取从i开始、长度为k的子串就行。

举个实际例子:比如字符串是"ABCD",k=3,那么合法起始索引是0和1,对应的子串就是"ABC"和"BCD",正好是你要的结果。

问题二:修正你的C++代码错误

咱们来看看你代码里的问题:

  • 多余的内层循环:你写了两层循环,外层遍历起始索引i,内层又遍历r从k-1到字符串末尾,这会导致输出很多不符合要求的短子串(比如你实际输出里的AB、BC),完全没必要。
  • substr参数误用:C++的string::substr(pos, len)第二个参数是子串的长度,不是结束位置。你写的s.substr(i,r)是从i开始取r个字符,这和你要的固定长度k完全不匹配。

下面是修正后的代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
void solution() {
    string s;
    ll k;
    cin >> s >> k;
    // 只需要一层循环,遍历所有合法的起始索引
    for(int i=0; i <= (int)s.length() - k; i++) {
        // 从i开始截取长度为k的子串
        cout << s.substr(i, k) << endl;
    }
}
int main() {
    ll t;
    cin >> t;
    while(t--){
        solution();
    }
    return 0;
}

(注:这里把s.length() - k转成int是因为s.length()返回的是size_t类型,和int的i比较可能会有警告,转一下更稳妥)

测试输入1 ABCD 3,输出就是:

ABC
BCD

完全符合你的期望啦!

内容的提问来源于stack exchange,提问作者youssef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:39:08