当前位置: 首页 > news >正文

【Python 千题 —— 算法篇】重复字符查找

请添加图片描述

Python 千题持续更新中 ……
脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐

字符串处理

题目背景

在处理字符串时,我们经常需要分析字符的频率,找出那些出现次数超过一次的重复字符。这在数据处理、文本分析、密码学等多个领域都有广泛的应用。比如,在字符串中找出重复的字符,可以帮助我们发现数据的规律性或错误信息,甚至可以用于密码破解或压缩算法的设计。

本题目要求找出给定字符串中所有重复出现的字符,并统计每个重复字符的出现次数。这是一个经典的字符串处理问题,掌握后可以更好地理解字符频率统计和哈希表的使用。

题目描述

编写一个函数 find_duplicate_chars(),该函数接收一个字符串 s 作为输入,返回字符串中所有重复出现的字符及其出现的次数。

函数需满足以下要求:

  1. 定义函数 find_duplicate_chars(s),返回一个字典,键为重复字符,值为出现次数。
  2. 输入为空字符串时,返回空字典。
  3. 需要忽略大小写,即 ‘A’ 和 ‘a’ 视为同一个字符。
  4. 只统计字母字符,其他字符不参与统计。

输入描述

  • 一个字符串 s,包含大小写字母、数字、符号等。

输出描述

  • 返回一个字典,键为重复出现的字母字符,值为其出现次数。

示例

示例 ①

输入:

# 调用 find_duplicate_chars() 函数
print(find_duplicate_chars("Programming is fun!"))

输出:

{'r': 2, 'g': 2, 'm': 2, 'i': 2, 'n': 2}
示例 ②

输入:

print(find_duplicate_chars("123456!"))

输出:

{}

代码讲解与多种解法

解法一:使用字典记录字符频率

我们可以使用 Python 的字典来记录每个字母字符出现的次数。遍历字符串时,将字符转换为小写并跳过非字母字符。然后,在统计完频率后,过滤出那些出现次数大于1的字符,形成最终的结果。

def find_duplicate_chars(s):if not s:return {}s = s.lower()  # 忽略大小写char_count = {}# 统计每个字符的频率for char in s:if char.isalpha():  # 只统计字母字符if char in char_count:char_count[char] += 1else:char_count[char] = 1# 过滤出出现次数大于1的字符return {char: count for char, count in char_count.items() if count > 1}

优点:

  • 代码简洁,字典操作的时间复杂度为 O(n),n 为字符串的长度。
  • 字符频率统计直观,符合大多数应用场景。

缺点:

  • 只能处理字母字符,不适用于复杂的字符统计需求(如需要统计数字、符号等)。

解法二:使用 collections.Counter

Python 标准库 collections 提供了 Counter 类,可以简化字符频率的统计过程。Counter 是一个字典的子类,专门用于计数操作。通过 Counter 可以方便地统计字符频率,并直接筛选出重复字符。

from collections import Counterdef find_duplicate_chars(s):if not s:return {}s = s.lower()char_count = Counter([char for char in s if char.isalpha()])# 过滤出重复字符return {char: count for char, count in char_count.items() if count > 1}

优点:

  • Counter 提供了更高效的计数方法,减少了代码量。
  • 易于理解和使用,适合快速实现字符频率统计。

缺点:

  • 和第一种方法一样,默认只统计字母字符。

解法三:使用集合(Set)辅助查找

我们可以通过使用两个集合来实现字符的重复查找。第一个集合用于记录遍历过的字符,第二个集合用于保存重复的字符。遍历过程中,如果当前字符已经存在于第一个集合中,则将其添加到第二个集合中。

def find_duplicate_chars(s):if not s:return {}s = s.lower()seen = set()duplicates = set()char_count = {}for char in s:if char.isalpha():if char in seen:duplicates.add(char)else:seen.add(char)# 统计重复字符的次数for char in duplicates:char_count[char] = s.count(char)return char_count

优点:

  • 使用集合避免了重复字符的多次统计。
  • 简单明了,逻辑清晰。

缺点:

  • 相比前两种方法,代码略显繁琐,效率稍低,因为 count() 方法会在整个字符串中搜索每个重复字符。

总结与思考

在查找字符串中的重复字符时,字典和 Counter 是两种非常高效的工具。字典可以灵活地处理字符频率统计,而 Counter 则提供了更简洁的写法,减少了手动的频率统计过程。

使用集合的方法也很直观,特别是在需要避免重复字符时表现出色。不过由于集合方法的重复字符统计效率较低,在处理长字符串时可能性能不如前两种方法。

扩展思考

在实际应用中,查找字符串中的重复字符往往是其他问题的基础步骤。例如,在字符串压缩算法中,找到高频字符有助于更好地压缩文本;在密码学中,字符频率分析也是破解密码的重要手段之一。掌握这一基本操作后,可以将其应用到更多的场景中。


通过本文,你可以掌握查找字符串中重复字符的多种方法,并学会根据场景选择最合适的解决方案。希望本文能够帮助你在处理字符串问题时更加得心应手。

持续关注博客,获取更多编程练习与技巧!
持续关注博客,获取更多编程练习与技巧!
作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 把设计模式用起来!(2)
  • 【全网首发】2024数学建模国赛E题31页word版成品论文【附带完整解题代码+可视化图表】
  • PostgreSQL的基础知识
  • 1. Fabric.js安装使用
  • 110001安庆巡检_工艺巡检
  • 原型与原型链
  • 模型中间部分的卷积可视化
  • 轴承知识大全,详细介绍(附3D图纸免费下载)
  • 中秋节如何利用Python发送彩信
  • 国内外大模型汇总(包括科大星火、文心一言、通义千问、智普清言、华为大模型)
  • WPS中JS宏使用说明(持续优化...)
  • LSPosed 模块开发入门和踩的坑
  • MacBook air pro验机流程
  • STM32(一)简介
  • 【总结】CSS(SCSS) 不常用属性
  • JavaScript-如何实现克隆(clone)函数
  • [数据结构]链表的实现在PHP中
  • 08.Android之View事件问题
  • Angular6错误 Service: No provider for Renderer2
  • JavaScript异步流程控制的前世今生
  • Java到底能干嘛?
  • JSONP原理
  • js中的正则表达式入门
  • mysql外键的使用
  • python_bomb----数据类型总结
  • Python3爬取英雄联盟英雄皮肤大图
  • SpringBoot几种定时任务的实现方式
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 阿里云前端周刊 - 第 26 期
  • 记录一下第一次使用npm
  • 蓝海存储开关机注意事项总结
  • 利用jquery编写加法运算验证码
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 详解NodeJs流之一
  • 因为阿里,他们成了“杭漂”
  • 终端用户监控:真实用户监控还是模拟监控?
  • zabbix3.2监控linux磁盘IO
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #Java第九次作业--输入输出流和文件操作
  • (1)(1.13) SiK无线电高级配置(五)
  • (arch)linux 转换文件编码格式
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (k8s)Kubernetes本地存储接入
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)ssm高校实验室 毕业设计 800008
  • (一)插入排序
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • 、写入Shellcode到注册表上线
  • .NET LINQ 通常分 Syntax Query 和Syntax Method