您的位置:首页 > 编程语言

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

2017-03-06 13:08 330 查看


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



下面给出三种方法:

方法一只能用求出最后一串最长连续数字子串

方法二用动态规划,方法三利用c++标准库里的vector容器(相当于java中的ArrayList)求解。这两种方法可得到完美解

方法一:

#include<iostream>
#include<cstdio>
#include<cstring>
#define MAX 100
using 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 100
using 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 200
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐