字符串中找出连续最长的数字串

    xiaoxiao2022-07-02  103

     

    题目:

    分析:

    方法(1):动态规划。只考虑对角线上的数据,因为对角线构成整个字符串

    #include <iostream> #include <vector> using namespace std; int main() { string s; while (getline(cin,s)) { int len = s.size(); vector<vector<int>> vv; vv.resize(len); for (int i = 0; i<len; i++) { vv[i].resize(len); } //第一个字符是数字就将其标记为1,否则是0 if (isdigit(s[0])) vv[0][0] = 1; else vv[0][0] = 0; int max = vv[0][0]; int index = 0; //只走对角线 for (int i = 1; i<vv.size(); i++) { for (int j = i; j<i + 1; j++) { if (isdigit(s[i]))//当前字符是数字,那么截止当前位置的数字串长度就是1+前面的长度 vv[i][j] = vv[i - 1][j - 1] + 1; else//当前不是数字直接将该位置置0 vv[i][j] = 0; if (vv[i][j] > max)//每次看是否需要更新max { max = vv[i][j]; index = i - max + 1;//记录当前数字串的起始下标 } } } //截取最长的字符串 string ret = s.substr(index, max); cout << ret << endl; } return 0; }

    方法(2):直接遍历保存最长的数字串,每找到连续的数字串要进行判断与更新

    int main() { string s; getline(cin, s); int i = 0; int max = 0; string ret; while (i<s.size()) { int count = 0; int start = i;//记录每一次的起始处 while (i<s.size() && isdigit(s[i])) { count++; i++; } //一组完了 if (count>max) { max = count; ret = s.substr(start, count); } i++;//不是数字直接进行判断下一个字符 } cout << ret << endl; return 0; }

     

    最新回复(0)