【问题描述】
读入一个字符串str,求出字符串str中连续最长的数字串的长度。
【输入描述】
包含一个测试用例,一个字符串str, 长度不超过255
【输出描述】
在一行内输出str中连续最长的数字串的长度。
【输入样例】
abcd12345ed125ss123456789
【输出样例】
9
思路:
刚刚我们分析过最长递增子序列,其实这一题就是对那一类问题的一个变种,同样也是求一个最长序列的长度,只不过约束条件成了求数字串而已,其他地方几乎没什么区别。
所以我们设dp[i]表示以str[i]字符结尾的连续数字串的长度,分析状态转移方程前,先手动的把dp数表填一遍,方程往往在填的时候就会领会到了。
本题状态转移方程:1.当str[i]是数字字符的时候,dp[i] = dp[i - 1] + 1;
2.当str[i]不是数字字符的时候,dp[i] = 0;
参考代码:
/*
dp问题,分析思路和最长递增子序列很像
abcd12345ed125ss123456789
*/
#include<iostream>
#include<cstdlib>
using namespace std;
string str;
const int maxn = 256;
int dp[maxn];
int DP(int n)
{
//处理掉边界
if(isdigit(str[0]))
dp[0] = 1;
else
dp[0] = 0;
//其他的
for(int i = 1;i < n;i++)
{
if(isdigit(str[i]))
dp[i] = dp[i - 1] + 1;
else
dp[i] = 0;
}
//打印dp数组
cout << "dp数组:";
for(int i = 0;i < n;i++)
{
cout << dp[i] << " ";
}
cout << endl;
//找最大的
int max_res = 0;
for(int i = 0;i < n;i++)
{
if(dp[i] > max_res)
max_res = dp[i];
}
return max_res;
}
int main()
{
cin >> str;
int len = str.length();
cout << DP(len) << endl;
return 0;
}
运行结果