每日一题

题目

从字符串中移除星号
给你一个包含若干星号 * 的字符串 s
在一步操作中,你可以:

  • 选中 s 中的一个星号。
  • 移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。

返回移除 所有 星号之后的字符串。

注意:

  • 生成的输入保证总是可以执行题面中描述的操作。
  • 可以证明结果字符串是唯一的。

示例 1:

输入s = "leet**cod*e"
输出"lecoe"
解释:从左到右执行移除操作:

  • 距离第 1 个星号最近的字符是 “lee t **cod*e” 中的 ‘t’ ,s 变为 “lee*cod*e” 。
  • 距离第 2 个星号最近的字符是 “le e *cod*e” 中的 ‘e’ ,s 变为 “lecod*e” 。
  • 距离第 3 个星号最近的字符是 “leco d *e” 中的 ‘d’ ,s 变为 “lecoe” 。

不存在其他星号,返回 “lecoe” 。

示例 2:

输入s = "erase*****"
输出""
解释:整个字符串都会被移除,所以返回空字符串。

通过代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
string removeStars(string s) {
string res = "";
int n=s.size();
int nx=0;
// 从后向前找,逆序保存
while(n>0){
n--;
if(s[n]=='*')nx++; // 遇见*,记录数量
else{ // 遇见非星号
if(nx){
nx--; //若此时后方有未消的*,直接跳过该小写字母
}else{
res+=s[n]; //后方无*,保留小写字母
}
}
}
string res1="";
for(int i=res.size()-1;i>=0;i--){ // 再回正
res1+=res[i];
}
return res1;
}

};

代码解释

今日题目为模拟题,较为简单