题目的主要信息:

  • 将一个字符中所有的整数前后加上符号“*”,其他字符保持不变
  • 连续的数字视为一个整数

方法一:遍历添加

具体做法:

我们可以遍历字符串,每次遇到一个数字字符就在前面添加一个星号,然后使用循环连续遍历这个子串的所有数字字符,直到遇到第一个不是数字字符的,在其前面添加另一个星号即可。

alt

#include<iostream>
#include<string>
using namespace std;

int main(){
    string s;
    while(cin >> s){
        for(int i = 0; i < s.length(); i++){
            if(isdigit(s[i])){ // 每次第一个遇到的数字前加*
                s.insert(i, "*");
                i++;
                while(isdigit(s[i])) //遍历连续的数字找到这一段的最后一个数字
                    i++;
                s.insert(i, "*"); //最后加*
             }
        }
        cout << s << endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为字符串长度,整体上遍历整个字符串所有字符
  • 空间复杂度:O(1)O(1),常数级空间,无额外空间

方法二:正则表达式

具体做法:

我们也可以用正则表达式匹配字符串中的数字,然后用正则替换将数字替换成前后夹着星号的数字字符子串。

#include<iostream>
#include<string>
#include<regex>
using namespace std;

int main(){
    string s;
    while(cin >> s){
        regex patten("(\\d+)"); //正则表达式匹配数字
        s = regex_replace(s, patten, "\*$1\*"); //将数字的地方替换成前后有*
        cout << s << endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为字符串长度,正则表达式匹配也是O(n)O(n)
  • 空间复杂度:O(1)O(1),正则表达式辅助字符串也只有常数空间