首页 > 学院 > 开发设计 > 正文

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

2019-11-06 06:47:47
字体:
来源:转载
供稿:网友

这里写图片描述

这个题目有个巨坑,那就是当字符串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;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表