给定一字符串S,请编程输出最长的连续数字串。(此题有坑)

来源:互联网 发布:mysql max 日期 编辑:程序博客网 时间:2024/05/16 03:00

这里写图片描述

这个题目有个巨坑,那就是当字符串s中最长连续数字串可能不只一串,例如:
这里写图片描述

下面给出三种方法:
方法一只能用求出最后一串最长连续数字子串
方法二用动态规划,方法三利用c++标准库里的vector容器(相当于java中的ArrayList)求解。这两种方法可得到完美解

方法一:

#include<iostream>#include<cstdio>#include<cstring>#define MAX 100using namespace std;void input(char arr[]){    int i=0;    char c;    while((c=getchar()) != '#')        *(arr+(i++)) = c;    *(arr+i) = '\0';}int main(){    char s[MAX];    cout<<"请输入字符串s: ";    input(s);    int i, len=0, max_len=0, temp=0, end=0;    for(i=0; i<=strlen(s); ++i)    {        //当i==strlen(s)时,s[i]里存的是'\0'执行else里的代码,此时考虑的是最长数字串在整个字符串的末尾的情况        if(s[i]>='0' && s[i]<='9')        {            temp = i;            ++len;        }else{            if(len > max_len)            {                end = temp;                max_len = len;            }            len = 0;        }    }    int start = end-max_len+1;    for(i=start; i<=end; ++i)        cout<<s[i];    cout<<"开始位置为:"<<start+1<<endl;    return 0;}

方法二:

#include<iostream>#include<cstdio>#include<cstring>#define MAX 100using namespace std;void input(char arr[]){    int i=0;    char c;    while((c=getchar()) != '#')        *(arr+(i++)) = c;    *(arr+i) = '\0';}int main(){    char s[MAX];    cout<<"请输入字符串s: ";    input(s);    int i,j, max_len=0, s_len=strlen(s);    int dp[s_len]={0};    //初始化动态规划的初值    if(s[0]>='0' && s[0]<='9')        dp[0]=1;    for(i=1; i<s_len; ++i)    {        //状态转移方程,根据前面已有的解推出当前解        if(s[i]>='0' && s[i]<='9')            dp[i] = dp[i-1]+1;        else            dp[i] = 0;    }    for(i=0; i<s_len; ++i)    {        if(dp[i]>max_len)            max_len = dp[i];    }    for(i=0; i<s_len; ++i)    {        //最长数字字串可能不只一串        if(dp[i] == max_len)        {            for(j=i-max_len+1; j<=i; ++j)                cout<<s[j];            cout<<"开始位置为:"<<(i-max_len+2)<<endl;        }    }    return 0;}

方法三:

#include<iostream>#include<string>#include<vector>#define MAX 200using namespace std;int main(){    vector<string> arr;//放置最长数字字串    vector<int> index;//放置最长数字字串的开始位置    string input="", temp="";    cin>>input;    int i, max_len=0;    for(i=0; i<=input.length(); ++i)    {        if(input[i]>='0' && input[i]<='9')        {            temp += input[i];        }else{            if(temp.length() == max_len)            {                arr.push_back(temp);                index.push_back(i-temp.length()+1);            }else if(temp.length() > max_len)            {                //清空已经不是最长字串的子串和开始位置                arr.clear();                index.clear();                arr.push_back(temp);                index.push_back(i-temp.length()+1);                max_len = temp.length();            }            temp="";        }    }    for(i=0; i<arr.size(); ++i)        cout<<arr[i]<<"  开始位置为:"<<index[i]<<endl;    return 0;}
0 0
原创粉丝点击