给定一字符串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; }
相关文章推荐
- 读入一个字符串str,输出字符串str中的连续最长的数字串
- 【编程题目】在字符串中找出连续最长的数字串,并把这个串的长度返回
- 2015输入一个字符串以#结尾,则输出此字符串中连续出现最长的数字串及其开始的下标;
- 找出一个字符串中最长的连续数字子串,输出该字符串及长度
- 华为2018秋招编程题1:在字符串中找出连续最长的数字串
- 编程实现:从字符中获取连续数组序列,如字符串"a1dl2iad9j3la5kudp7u9pn4blj8ap5u3e6ml9a"中可以得到的连续数字序列为1234556.【注】:只考虑一位,因此最长的数
- 一个字符串,输出字符串中连续最长的数字串,并输出个数
- 读入一个字符串str,输出字符串str中的连续最长的数字串
- 2015上机一 输出字符串中连续出现最长的数字串及其开始的下标
- 每天学习一点编程(4)(在字符串中找出连续最长的数字串,并把这个串的长度返回)
- 返回给定字符串中最长连续数字串
- 字符串中找连续最长的数字串
- 求字符串中最长连续数字子串的长度
- 第25题: 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr),在字符串中找出连续最长的数字串,并把这个串的长度返回
- 在字符串中找出连续最长的数字串
- 在字符串中找出连续最长的数字串
- 在字符串中找出连续最长的数字串
- 查找字符串中连续的最长的数字串
- 微软面试之25 在字符串中找出连续最长的数字串,并把这个串的长度返回,
- 在字符串中找出连续最长的数字串