freeCodeCamp 每日编程挑战 44:String Mirror(字符串镜像判定)Python 实现解析
freeCodeCamp 每日编程挑战 44String Mirror字符串镜像判定Python 实现解析【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇技术指南围绕 freeCodeCamp 开源仓库中的每日编程挑战Challenge 44: String Mirror展开深入拆解判定第二个字符串是否为第一个字符串的镜像这一字符串处理问题从题目约束大小写敏感、忽略非字母字符出发逐步推导出基于过滤 反转 比较的三步解题思路并给出通过全部 7 个官方测试用例的参考解法。读完本文你不仅能直接解出这道题还能理解它背后的字符过滤、切片反转等 Python 字符串核心技法以及它如何在 freeCodeCamp 的前端Web Worker Pyodide与后端 API 体系中运行与判题。题目背景Daily Coding Challenges 与挑战 44 的定位String Mirror 是 freeCodeCamp 仓库中daily-coding-challenges-python这一 Python 每日挑战块的Challenge 44。挑战块在 curriculum/structure/blocks/daily-coding-challenges-python.json 中定义采用challengeType: 29Python 每日挑战类型与usesMultifileEditor: true的多文件编辑器布局并归属helpCategory: Python。题目源文件位于 curriculum/challenges/english/blocks/daily-coding-challenges-python/68b1f72371a5ac895ac70a0a.md文件头部携带id、challengeType、dashedName等元数据供课程构建工具解析。每日挑战与常规课程挑战的运行环境一致Python 代码由浏览器端 Web Worker 加载 Pyodide 执行验证逻辑则通过runPython注入测试。前端渲染层位于 client/src/client-only-routes/show-daily-coding-challenge.tsx它从 API 拉取按日期组织的挑战数据后复用经典挑战模板渲染其测试用例 client/src/client-only-routes/show-daily-coding-challenge.test.tsx 中可看到 Python 测试串以({test: () { runPython(\...)}}) 的形式下发。题目解读什么是字符串镜像题目原文如下Given two strings, determine if the second string is a mirror of the first.即给定两个字符串判断第二个字符串是否为第一个字符串的镜像。官方对镜像给出了三条明确约束反向包含一个字符串若按相反顺序包含相同的字母即视为镜像大小写敏感大写字母与小写字母视为不同字符H与h不等价忽略非字母字符所有非字母字符空格、数字、标点、符号等在比较前应被剔除。换句话说比较的不是原始字符串本身而是过滤掉非字母字符之后的字母序列且第一个字符串要取其反转形式与第二个字符串的过滤结果比较。这三条约束决定了最终算法必须包含清洗clean环节绝不能直接对原串做反转比较。解题思路拆解过滤 → 反转 → 比较按照题目的三条约束解法可自然拆分为三步过滤非字母字符分别遍历两个字符串只保留字母str.isalpha()返回True的字符。这一步同时消解了忽略所有非字母字符的约束反转第一个字符串对第一个字符串的过滤结果使用切片[::-1]反转体现相反顺序的要求等值比较将反转后的第一个字符串与第二个字符串的过滤结果做精确比较。因为约束要求大小写敏感直接使用即可不需要额外的大小写归一化操作。值得注意的细节第 3 步使用的是过滤后的第二个字符串因此第二个字符串中的空格、连字符、感叹号等字符天然被忽略而第一步保留大小写原样从而保证RaceCar与raCecaR这类反转后大小写位置互换的用例不会被错误判定为相等。参考解法官方实现与逐行解读题目在# --solutions--区块给出了官方参考解法def is_mirror(str1, str2): clean1 .join(c for c in str1 if c.isalpha()) clean2 .join(c for c in str2 if c.isalpha()) return clean1[::-1] clean2逐行解读c for c in str1 if c.isalpha()生成器表达式逐个取出str1中的字符仅保留isalpha()返回True的字母字符。str.isalpha()是 Python 内建字符串方法对 Unicode 字母同样有效.join(...)将过滤后的字符序列拼接为新的字符串clean1str2同理得到clean2这一步得到了两个纯净字母序列clean1[::-1]利用切片步长为-1实现整体反转这是 Python 中最简洁的反转写法return clean1[::-1] clean2反转后的序列与第二个清洗序列做布尔比较直接作为返回值。种子代码与运行入口题目在# --seed--区块提供了如下种子代码供学习者从零补全函数体def is_mirror(str1, str2): return str1种子函数签名固定为is_mirror(str1, str2)函数必须返回布尔值。判题时测试串会通过runPython注入调用unittest.TestCase().assertIs(is_mirror(...), 期望值)断言返回值与期望布尔值是否一致assertIs要求结果为同一对象因此返回True/False字面量即可通过。函数体补全后即形成上述完整解法。官方测试用例全量解析题目在# --hints--区块给出了 7 个测试用例它们共同覆盖了镜像判定的各个边界场景。下表完整列出各用例的输入、预期输出及其考察点输入str1, str2预期结果考察点(helloworld, helloworld)False相同字符串并非镜像反转后与自身比较不相等非回文(Hello World, dlroW olleH)True含空格的标准镜像空格被过滤后HelloWorld反转得dlroWolleH与过滤后的第二个串相等(RaceCar, raCecaR)True大小写敏感下的镜像反转保持大小写原样RaceCar[::-1]恰好为raCecaR(RaceCar, RaceCar)False大小写敏感的体现反转后为raCecaR与自身不相等(Mirror, rorrim)False大小写敏感反转后为rorriM与全小写的rorrim不相等(Hello World, dlroW-olleH)True忽略非字母字符第二个串中的连字符被过滤(Hello World, !dlroW !olleH)True忽略标点与空格感叹号、空格均被过滤对测试 5 做一次完整推演以验证算法正确性str1 Mirror过滤后仍为Mirror反转得rorriMstr2 rorrim过滤后仍为rorrimrorriM rorrim为False输出正确。同理测试 7 中!dlroW !olleH过滤掉感叹号和空格后为dlroWolleH恰好等于Hello World过滤后反转的结果。多方案对比三种实现思路与取舍除官方解法外还存在多种等价实现可根据个人风格与对 Python 语法的熟悉程度选择方案 A官方写法生成器 join 切片反转def is_mirror(str1, str2): clean1 .join(c for c in str1 if c.isalpha()) clean2 .join(c for c in str2 if c.isalpha()) return clean1[::-1] clean2最贴近题目语义一行过滤、一行反转可读性最佳。方案 Bfilter 函数 reversed 反转def is_mirror(str1, str2): clean1 .join(filter(str.isalpha, str1)) clean2 .join(filter(str.isalpha, str2)) return .join(reversed(clean1)) clean2利用内建filter替代生成器表达式用reversed()迭代器替代切片反转。filter(str.isalpha, str)中str.isalpha会以字符串为参数被自动调用写法更函数式。方案 C正则表达式清洗import re def is_mirror(str1, str2): clean1 re.sub(r[^a-zA-Z], , str1) clean2 re.sub(r[^a-zA-Z], , str2) return clean1[::-1] clean2用正则[^a-zA-Z]匹配并删除所有非大小写字母字符。注意此写法仅保留 ASCII 字母若输入包含 Unicode 字母会与isalpha()行为不一致在本题 ASCII 用例下可通过全部测试。三种方案的共同点是都满足忽略非字母字符与大小写敏感两条核心约束时间复杂度均为 O(n)空间复杂度为 O(n)需要两份清洗后的字符串。运行与验证在本地复现判题逻辑本题的解法和判题逻辑均可脱离完整课程环境在本地 Python 环境中独立验证。将官方解法保存后可用与题目测试串完全一致的方式运行from unittest import TestCase def is_mirror(str1, str2): clean1 .join(c for c in str1 if c.isalpha()) clean2 .join(c for c in str2 if c.isalpha()) return clean1[::-1] clean2 t TestCase() t.assertIs(is_mirror(helloworld, helloworld), False) t.assertIs(is_mirror(Hello World, dlroW olleH), True) t.assertIs(is_mirror(RaceCar, raCecaR), True) t.assertIs(is_mirror(RaceCar, RaceCar), False) t.assertIs(is_mirror(Mirror, rorrim), False) t.assertIs(is_mirror(Hello World, dlroW-olleH), True) t.assertIs(is_mirror(Hello World, !dlroW !olleH), True) print(All 7 assertions passed.)在 freeCodeCamp 真实环境中这 7 个断言由挑战页面的测试框架执行测试串通过runPython注入 Python 运行时其底层执行入口在 client/src/templates/Challenges/utils/python-worker-handler.ts该模块通过python-worker.js创建 Web Worker由 Pyodide 在浏览器中执行用户代码并回传print/input等消息这一机制保证了unittest断言在沙箱中实时运行并即时反馈结果。延伸思考从镜像判定到回文与数据清洗String Mirror 虽是一道入门级字符串题但其核心技法具有广泛复用价值isalpha()与字符过滤是文本数据清洗的基础常用于日志解析、用户名规范化、搜索索引预处理等场景配合isdigit()、isalnum()、isspace()可构建更复杂的清洗规则切片反转[::-1]是 Python 反转序列的标准手法也可用reversed()join替代两者的边界行为一致镜像判定与回文palindrome判定本质同源若is_mirror(s, s)返回True则s是回文。这一联系也解释了为何测试 1helloworld对自身预期为False——该串并非回文将本题与同系列挑战对比可发现家族式设计Challenge 43 Digits vs Letters数字与字母分类、Challenge 177 String Mirror另一块中的同名变体等均围绕字符分类与序列变换展开可形成系统训练。小结Challenge 44: String Mirror 用一道简洁的字符串题串起了 Python 中最常用的三个字符串处理技能isalpha()字符过滤、join拼接与[::-1]切片反转。掌握先清洗、再变换、后比较的三步思路即可通过全部 7 个官方测试用例同时理解其大小写敏感与忽略非字母字符的边界约束能帮助你在真实文本处理场景中写出更健壮的代码。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考