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

如何从纯数字串生成非连续4位最大子序列并求解最大值?

解决:从含字母数字串中找长度为4的最大非连续数字子序列

需求

给定一个混有字母和数字的字符串,先移除所有字母得到纯数字串,再找出其中长度为4、保持原有顺序的非连续子序列的最大值。

示例

输入:24d5n4r05f704n652z393
处理后纯数字串:245405704652393
输出:7693

当前代码问题

现有代码只能生成连续子串(如2、24、245),无法生成符合要求的非连续子序列(如254、440),因此无法正确求解最大值。原代码如下:

#include <string>
#include <vector>
#include <iostream>

using namespace std;

ifstream fi;
ofstream fo;

void tlw(string &s){  //将大写字母转换为小写
    for(int i=0; i<s.length(); i++){
        if(s[i]>='A'&&s[i]<='Z'){
            s[i]=tolower(s[i]);
        }
    }
}
void duyet(string s, int n){  //生成子串并比较最大值
    int max = 0, dem;
    string new_s;
    vector<string> a;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            new_s = s.substr(i,j-i+1);   //此处为需要修改的核心部分
            if (new_s.length() == 4){
                int dem = stoi(new_s);
                if (max<dem){
                    max = dem;
                }
            }
        }
    }
    fo<<max;
}
void xuli(string s, int n){     //问题处理函数
    tlw(s);
    int e = 0;
    for(int i=0; i<n; i++){
        if (s[i] >= 'a' && s[i] <= 'z'){
            e = i; 
            s.erase(e,1);
        }
    }
    duyet(s,s.length());
}
int main(){
    fi.open("dctn.inp");fo.open("dctn.out");
    string s;
    fi>>s; int n = s.length();
    xuli(s,n);
    fi.close();fo.close();
}

修改方案

1. 修复字母移除逻辑

原代码删除字母时会因为字符串长度变化导致索引错位,改用直接筛选数字的方式更可靠:

void xuli(string s, int n){     
    tlw(s);
    string num_str;
    // 只保留数字字符
    for(char c : s){
        if(isdigit(c)){
            num_str += c;
        }
    }
    duyet(num_str, num_str.length());
}

2. 重写子序列生成逻辑

要生成长度为4的非连续子序列,需要遍历所有满足i < j < k < l的索引组合,提取对应字符拼接后比较最大值,修改duyet函数:

void duyet(string s, int n){  
    int max_val = 0;
    // 遍历所有合法的4元非连续索引组合,确保顺序i<j<k<l
    for(int i=0; i < n-3; i++){
        for(int j=i+1; j < n-2; j++){
            for(int k=j+1; k < n-1; k++){
                for(int l=k+1; l < n; l++){
                    string sub = string(1, s[i]) + s[j] + s[k] + s[l];
                    int num = stoi(sub);
                    if(num > max_val){
                        max_val = num;
                    }
                }
            }
        }
    }
    fo<<max_val;
}

说明

  • 字母移除逻辑改为直接筛选数字,避免了删除字符后的索引错位问题,代码更简洁稳定。
  • 四层循环遍历所有符合要求的4位非连续子序列,确保生成的子序列保持原数字顺序,通过逐一比较得到最大值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:34:50