[英雄星球七月集训LeetCode解题日报] 第2日 字符串
日报
- 今天四道简单题。
题目
一、 2315. 统计星号
链接: 2315. 统计星号
1. 题目描述
2. 思路分析
- 这是上上周周赛签到题。
- 拆分计数即可。
3. 代码实现
class Solution:
def countAsterisks(self, s: str) -> int:
x = s.split('|')
ans = 0
for i in range(0,len(x),2):
ans += x[i].count('*')
return ans
二、 459. 重复的子字符串
链接: 459. 重复的子字符串
1. 题目描述
2. 思路分析
- 暴力枚举长度n的约数来决定循环节的长度,然后验证。
- 看了题解,联想到上次做的一道题。
- 发现找寻环节的题,通常可以对字符串进行拼接后判断相等的操作。
3. 代码实现
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
n = len(s)
for i in range(1,n//2+1):
if n % i == 0:
repeat = n // i
p = s[:i]
# print(n,i,repeat,p)
if all(p == s[i*j:i*j+i] for j in range(1,repeat)):
return True
return False
三、 1790. 仅执行一次字符串交换能否使两个字符串相等
链接: 1790. 仅执行一次字符串交换能否使两个字符串相等
1. 题目描述
2. 思路分析
- 实际是判断s1和s2是不是字母异位词(本题可以不异位)。
- 首先统计字符频次,必须严格相等。
- 然后看每个位置不同的次数只能<=2。
- python能写一行,但要遍历两次了,还是手写吧。
3. 代码实现
class Solution:
def areAlmostEqual(self, s1: str, s2: str) -> bool:
c1,c2 = Counter(),Counter()
diff = 0
for i,c in enumerate(s1):
c1[c] += 1
c2[s2[i]] += 1
if c != s2[i]:
diff += 1
if diff > 2:
return False
return c1 == c2
四、 1961. 检查字符串是否为数组前缀
1. 题目描述
2. 思路分析
- 没看清题意,wa了一次。
- 注意必须是words中的前k个
字符串
,拼接
后正好等于s。不能切分这些字符串。 - 因此从words头中找前k个字符串长度正好等于s的,拼起来判断相等即可。
- 当然,按字符判断更快。
3. 代码实现
class Solution:
def isPrefixString(self, s: str, words: List[str]) -> bool:
n = len(s)
i = 0
t = 0
for i in range(len(words)):
t += len(words[i])
if t > n:
return False
if t == n:
break
if t == n:
return s == ''.join(words[:i+1])
return False