给定一字符串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
- 给定一字符串S,请编程输出最长的连续数字串。(此题有坑)
- 输出字符串中连续最长的数字串
- 2015上机一 输出字符串中连续出现最长的数字串及其开始的下标
- 一个字符串,输出字符串中连续最长的数字串,并输出个数
- 2015输入一个字符串以#结尾,则输出此字符串中连续出现最长的数字串及其开始的下标;
- 读入一个字符串str,输出字符串str中的连续最长的数字串
- 读入一个字符串str,输出字符串str中的连续最长的数字串
- 给定一个字符串s,请计算输出含有连续两个s作为子串的最短字符串。
- 《好未来编程题》字符串中找出连续最长的数字串
- 华为2018秋招编程题1:在字符串中找出连续最长的数字串
- 查找字符串中连续的最长的数字串
- 请一个在字符串中找出连续最长的数字串,并把这个串的长度返回;如果存在长度相同的连续数字串,返回最后一个连续数字串
- 每天学习一点编程(3)(输出给定字串的全部连续子串)
- 在字符串中找出连续最长的数字串
- 在字符串中找出连续最长的数字串
- 25、在字符串中找出连续最长的数字串
- 字符串中找连续最长的数字串
- 在字符串中找出连续最长的数字串
- CDH的Flume配置Adding multiple flows in an agent
- Ajax跨域请求
- AlloyTouch之无限循环select插件
- 关于mvp模式的simplenews项目学习(mvp模式解析)
- RxCache要点解读(四)
- 给定一字符串S,请编程输出最长的连续数字串。(此题有坑)
- socket客户端接收信息被堵塞
- Ubuntu 16.04 LTS 安装Theano配置GPU
- C++ vector动态数组常用函数
- 一些我面试过程中遇到j2ee知识点的整理,答案来源于网络
- 389. Find the Difference
- java字符串基本操作
- rtsp、rtp tcp和udp链接方式区别
- 迷茫的原因