[英雄星球七月集训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. 检查字符串是否为数组前缀

链接: 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

参考链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值