力扣每日一题 5/29

简介: 力扣每日一题 5/29

2981.找出出现至少三次的最长特殊子字符串I

题目:

给你一个仅由小写英文字母组成的字符串 s 。

如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串 "abc" 不是特殊字符串,而字符串 "ddd"、"zz" 和 "f" 是特殊字符串。

返回在 s 中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回 -1 。

子字符串 是字符串中的一个连续 非空 字符序列。

示例 1:

输入:s = "aaaa"

输出:2

解释:出现三次的最长特殊子字符串是 "aa" :子字符串 "aaaa"、"aaaa" 和 "aaaa"。

可以证明最大长度是 2 。

例 2:

输入:s = "abcdef"

输出:-1

解释:不存在出现至少三次的特殊子字符串。因此返回 -1 。

示例 3:

输入:s = "abcaba"

输出:1

解释:出现三次的最长特殊子字符串是 "a" :子字符串 "abcaba"、"abcaba" 和 "abcaba"。

可以证明最大长度是 1 。

提示:

  • 3 <= s.length <= 50
  • s 仅由小写英文字母组成。

分析:

       刚开始看了这道题十几分钟没思路,写了又删,删了又写。后来也是看了评论区的题解,整理了以下思路:

"""
1.设字母a的最长特殊子串的长度是L1
那么可以选3个长为 L1-2 的相同的特殊子串
2.设字母a的第二长特殊子串的长度是L2
如果 L1=L2.选 3 个长为L1-1的
如果 L1>L2.选 3 个长为L2的
min(L1-1,L2)
3.设字母a的第三长特殊子串的长度为L3 
那么可以选3个长为L3的相同的特殊子串
max(L1-2,min(L1-1,L2),L3)
"""

代码实现:

class Solution:
    def maximumLength(self, s: str) -> int:
        groups = defaultdict(list) # hashmap key:char value:list
        cnt=0
        for i ,ch in enumerate(s):
            # ch =s[i]
            cnt+=1
            if i==len(s)-1 or ch!=s[i+1]:
                groups[ch].append(cnt)
                cnt=0
        print(groups)
 
        ans=0
        for a in groups.values():
            a.sort(reverse=True)
            a.extend([0,0])  # 防止只有一个数 报错
            l1,l2,l3 = a[:3]  # 新写法
            ans = max(ans,l1-2,min(l1-1,l2),l3)
        return ans if ans else -1  # ans大于0 返回ans 否则返回-1
a=Solution()
b=a.maximumLength(s='aaaaba')
print(b)

总结:

这道题引入了新知识点,defaultdict()模块。

defaultdict()详解:

       defaultdict是collections模块中的一个类,它是一种字典的子类,它允许使用默认值来创建一个字典。当我们访问一个不存在的键时,defaultdict会自动创建这个键,并将其对应的值初始化为一个默认值。

默认值可以是任何类型,例如int、list、set、dict等。这样当我们需要向一个默认值为空的字典中添加元素时,就不需要担心键是否存在的问题,因为defaultdict会自动帮我们处理这个情况。

使用defaultdict可以更加简洁和高效地处理一些问题,特别是在需要处理大量数据或者复杂数据结构时。下面是一个使用defaultdict的例子:

from collections import defaultdict
 
# 创建一个defaultdict,指定默认值为list
d = defaultdict(list)
 
# 使用defaultdict来向字典中添加元素
d['a'].append(1)
d['b'].append(2)
d['c'].append(3)
 
print(d)  # 输出 defaultdict(<class 'list'>, {'a': [1], 'b': [2], 'c': [3]})

 在上面的例子中,当我们尝试向字典d中的不存在的键添加元素时,defaultdict会自动为这个键初始化一个空列表,并将元素添加到这个列表中。这样就避免了使用普通字典时需要先判断键是否存在的繁琐操作。

  不仅如此,还巧妙的用了extend([]) ,这样有效的防止了只有一个长度的报错情况。很敬佩这种思路。

不断的突破,创新,提高!这正是我所追求的!

目录
打赏
0
3
3
0
37
分享
相关文章
nacos常见问题之获取配置文件的时候报错user not found如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
2358 2
Akka事件驱动新选择
在高并发场景解决方案中,多从线程角度出发,以解决线程安全问题,锁范围又需要多业务场景考虑,何时上锁,何时解锁,何时自动过期等,而事件驱动是从执行什么操作驱动的,在软件系统的设计层面,两者关联性不大,一个强调安全,一个强调策略,那么有没有两者结合解决并发编程难的事件驱动解决方案呢?带着场景解决方案我们走进Akka。
474 0
Akka事件驱动新选择
Zabbix【部署 04】 Windows系统安装配置agent及agent2
Zabbix【部署 04】 Windows系统安装配置agent及agent2
1438 0
让跨 project 联查更轻松,SLS StoreView 查询和分析实践
在业务场景中,日志数据可能存储在日志服务 Project 的不同 Logstore/MetricStore 中或不同地域的 Project 中。日志服务的数据集(StoreView)功能支持跨地域、跨 Store 联合查询和分析,让用户基于数据集就能高效便捷地查询分析全地域的数据,真正做到数据分析不受地域边界的限制。
190 87
中小医院云HIS系统源码,系统融合HIS与EMR功能,采用B/S架构与SaaS模式,快速交付并简化运维
这是一套专为中小医院和乡镇卫生院设计的云HIS系统源码,基于云端部署,采用B/S架构与SaaS模式,快速交付并简化运维。系统融合HIS与EMR功能,涵盖门诊挂号、预约管理、一体化电子病历、医生护士工作站、收费财务、药品进销存及统计分析等模块。技术栈包括前端Angular+Nginx,后端Java+Spring系列框架,数据库使用MySQL+MyCat。该系统实现患者管理、医嘱处理、费用结算、药品管控等核心业务全流程数字化,助力医疗机构提升效率和服务质量。
264 4
OAuth 2.0资源授权机制与安全风险分析
OAuth 2.0资源授权机制与安全风险分析
264 1
No module named 'plotly.graph_objects'问题解决
No module named 'plotly.graph_objects'问题解决
504 0
No module named 'plotly.graph_objects'问题解决
信管知识梳理(四)新一代信息技术介绍
新一代信息技术产业包括:大数据、云计算、互联网+、物联网、智慧城市等是新一代信息技术与信息资源充分利用的全新也态,是信息化发展的主要趋势,也是信息系统集成行业今后面临的主要业务范畴。
357 0
信管知识梳理(四)新一代信息技术介绍
Apache Hudi 异步Compaction部署方式汇总
Apache Hudi 异步Compaction部署方式汇总
244 0
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问