2315-统计星号

Raphael Liu Lv10

给你一个字符串 s ,每 两个 连续竖线 '|'一对 。换言之,第一个和第二个 '|' 为一对,第三个和第四个
'|' 为一对,以此类推。

请你返回 不在 竖线对之间,s'*' 的数目。

注意 ,每个竖线 '|' 都会 恰好 属于一个对。

示例 1:

**输入:** s = "l|*e*et|c**o|*de|"
**输出:** 2
**解释:** 不在竖线对之间的字符加粗加斜体后,得到字符串:" ** _l_** |*e*et| ** _c**o_** |*de|" 。
第一和第二条竖线 '|' 之间的字符不计入答案。
同时,第三条和第四条竖线 '|' 之间的字符也不计入答案。
不在竖线对之间总共有 2 个星号,所以我们返回 2 。

示例 2:

**输入:** s = "iamprogrammer"
**输出:** 0
**解释:** 在这个例子中,s 中没有星号。所以返回 0 。

示例 3:

**输入:** s = "yo|uar|e**|b|e***au|tifu|l"
**输出:** 5
**解释:** 需要考虑的字符加粗加斜体后:" ** _yo_** |uar| ** _e**_** |b| ** _e***au_** |tifu| ** _l_** " 。不在竖线对之间总共有 5 个星号。所以我们返回 5 。

提示:

  • 1 <= s.length <= 1000
  • s 只包含小写英文字母,竖线 '|' 和星号 '*'
  • s 包含 偶数 个竖线 '|'

方法一:模拟

思路

根据题意,需要统计第偶数个竖线之后,第奇数个竖线之前,以及第一个竖线之前和最后一个竖线之后的星号。可以用一个布尔值 valid 表示接下去遇到的星号是否要纳入统计,初始化为 true,并且每次遇到竖线都要取反,最后返回符合条件的星号数量即可。

代码

[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
class Solution:
def countAsterisks(self, s: str) -> int:
valid = True
res = 0
for c in s:
if c == '|':
valid = not valid
elif c == '*' and valid:
res += 1
return res
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int countAsterisks(String s) {
boolean valid = true;
int res = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '|') {
valid = !valid;
} else if (c == '*' && valid) {
res++;
}
}
return res;
}
}
[sol1-C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Solution {
public int CountAsterisks(string s) {
bool valid = true;
int res = 0;
foreach (char c in s) {
if (c == '|') {
valid = !valid;
} else if (c == '*' && valid) {
res++;
}
}
return res;
}
}
[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int countAsterisks(string s) {
bool valid = true;
int res = 0;
for (int i = 0; i < s.size(); i++) {
char c = s[i];
if (c == '|') {
valid = !valid;
} else if (c == '*' && valid) {
res++;
}
}
return res;
}
};
[sol1-C]
1
2
3
4
5
6
7
8
9
10
11
12
13
int countAsterisks(char * s) {
bool valid = true;
int res = 0;
for (int i = 0; s[i] != '\0'; i++) {
char c = s[i];
if (c == '|') {
valid = !valid;
} else if (c == '*' && valid) {
res++;
}
}
return res;
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
9
10
11
12
13
var countAsterisks = function(s) {
let valid = true;
let res = 0;
for (let i = 0; i < s.length; i++) {
let c = s[i];
if (c === '|') {
valid = !valid;
} else if (c === '*' && valid) {
res++;
}
}
return res;
};
[sol1-Golang]
1
2
3
4
5
6
7
8
9
10
11
func countAsterisks(s string) (res int) {
valid := true
for _, c := range s {
if c == '|' {
valid = !valid
} else if c == '*' && valid {
res++
}
}
return
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是 s 的长度。只需要遍历 s 一遍。

  • 空间复杂度:O(1)。仅需要常数空间。

 Comments
On this page
2315-统计星号