题目的主要信息:
- 将一个字符中所有的整数前后加上符号“*”,其他字符保持不变
- 连续的数字视为一个整数
方法一:遍历添加
具体做法:
我们可以遍历字符串,每次遇到一个数字字符就在前面添加一个星号,然后使用循环连续遍历这个子串的所有数字字符,直到遇到第一个不是数字字符的,在其前面添加另一个星号即可。
#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;
}
复杂度分析:
- 时间复杂度:,其中为字符串长度,整体上遍历整个字符串所有字符
- 空间复杂度:,常数级空间,无额外空间
方法二:正则表达式
具体做法:
我们也可以用正则表达式匹配字符串中的数字,然后用正则替换将数字替换成前后夹着星号的数字字符子串。
#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;
}
复杂度分析:
- 时间复杂度:,其中为字符串长度,正则表达式匹配也是
- 空间复杂度:,正则表达式辅助字符串也只有常数空间