LeetCode 267:回文排列 II —— Swift 解法全解析

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 统计字符频率
      • 判断是否可能构成回文
      • 构建半边字符数组
      • 回溯生成半边排列
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 实际使用场景:回文排列在真实项目里能干啥?
      • 文本处理、数据清洗类系统
      • 游戏开发:名字合法性验证
      • 前端交互与密码强度设计
    • 总结

摘要

本文将深入探讨 LeetCode 第 267 题 —— 回文排列 II。我们将提供 Swift 的解题方案,解析其背后的逻辑,并通过示例测试验证其正确性。通过本篇文章,你将了解如何判断一个字符串的某个排列是否可以构成回文,并生成所有可能的回文排列。

描述

给定一个字符串 s,返回所有可能的回文排列(不重复)。如果无法构成回文,返回空列表。

示例 1:

输入: "aabb"
输出: ["abba", "baab"]

示例 2:

输入: "abc"
输出: []

提示:

  • 字符串长度范围:1 <= s.length <= 16
  • 字符串仅包含小写英文字母

题解答案

func generatePalindromes(_ s: String) -> [String] {var charCount = [Character: Int]()for char in s {charCount[char, default: 0] += 1}var oddCount = 0var mid = ""var halfChars = [Character]()for (char, count) in charCount {if count % 2 != 0 {oddCount += 1mid = String(char)}halfChars += Array(repeating: char, count: count / 2)}if oddCount > 1 {return []}var results = [String]()var used = [Bool](repeating: false, count: halfChars.count)halfChars.sort()backtrack(&halfChars, &used, "", mid, &results)return results
}func backtrack(_ halfChars: inout [Character], _ used: inout [Bool], _ path: String, _ mid: String, _ results: inout [String]) {if path.count == halfChars.count {let reversed = String(path.reversed())results.append(path + mid + reversed)return}for i in 0..<halfChars.count {if used[i] {continue}if i > 0 && halfChars[i] == halfChars[i - 1] && !used[i - 1] {continue}used[i] = truebacktrack(&halfChars, &used, path + String(halfChars[i]), mid, &results)used[i] = false}
}

题解代码分析

统计字符频率

我们首先统计字符串中每个字符出现的次数。通过遍历字符串,将每个字符的出现次数记录在字典 charCount 中。

判断是否可能构成回文

回文字符串的特点是:除了最多一个字符可以出现奇数次,其他字符必须出现偶数次。因此,我们统计出现奇数次的字符数量 oddCount。如果 oddCount 大于 1,则无法构成回文,直接返回空列表。

同时,我们记录出现奇数次的字符 mid,它将位于回文字符串的中间位置。

构建半边字符数组

对于每个字符,将其出现次数除以 2,得到一半的字符数组 halfChars。这是因为回文字符串是对称的,我们只需要生成一半的排列,另一半是其镜像。

回溯生成半边排列

我们使用回溯算法生成 halfChars 的所有不重复排列。为了避免重复,我们先对 halfChars 进行排序,并在回溯过程中跳过重复的字符。

在回溯的每一步,我们将当前路径 path 与其反转字符串 reversed 以及中间字符 mid 组合,构成一个完整的回文字符串,并添加到结果列表 results 中。

示例测试及结果

print(generatePalindromes("aabb"))  // 输出: ["abba", "baab"]
print(generatePalindromes("abc"))   // 输出: []
print(generatePalindromes("aabbh")) // 输出: ["abhha", "bahhb"]

这些测试用例验证了我们的算法在不同输入下的正确性。

时间复杂度

  • 时间复杂度:O(n!),其中 n 是字符串的长度。由于需要生成所有可能的排列,最坏情况下时间复杂度为阶乘级别。

空间复杂度

  • 空间复杂度:O(n),主要用于存储字符频率的字典、半边字符数组以及递归调用的栈空间。

当然可以,以下是加入了实际日常使用场景的优化版内容:

实际使用场景:回文排列在真实项目里能干啥?

乍一看,“生成回文字符串的所有排列”像是个纯算法题,没啥工程价值。但实际上,这种“回文判断 + 组合生成” 的能力在很多实际业务中也能派上用场,下面举几个接地气的例子:

文本处理、数据清洗类系统

假设你在做一个 聊天记录分析系统,需要识别用户是否输入了恶搞或特定格式的文本,比如“我叫ABBA,我的狗叫OTTO”,这种是典型的回文。

通过这个算法,你可以:

  • 快速识别是否可能是“对称型伪指令”
  • 标记为潜在的彩蛋、反转词分析
  • 做 NLP 模型数据增强时制造对称样本

游戏开发:名字合法性验证

在一些游戏中,玩家喜欢起一些特殊格式的名字,比如:

  • “雷神之心🪙nihs之神雷”
  • “回文杀abccba”

你可以通过这个算法辅助判断:当前玩家输入的名字是不是某种“可回文组合”,来判断是否触发某些特效或彩蛋。

前端交互与密码强度设计

有些前端 UI 组件里需要检查用户输入内容是否有模式化特征。比如:

  • 检查用户密码是不是“123321”、“abcba”这种对称字符串,降低安全评分;
  • 在输入文本时检测是否构成了一个回文并弹出动画(比如 AI 输入特效、密码提示等)

总结

通过统计字符出现次数并判断奇数次出现的字符数量,我们可以高效地判断一个字符串的某个排列是否可以构成回文,并生成所有可能的回文排列。这个方法简单而有效,适用于各种字符串输入。回溯算法在生成排列时,注意去重可以避免重复结果。希望本文对你理解回文排列问题有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JumpServer批量添加资产

环境说明&#xff1a;我的环境是H3C网络设备环境 一、在linux系统环境下通过Python脚本获取交换机信息&#xff0c;IP地址和设备名称一一对应&#xff0c;脚本如下&#xff1a; cat get_device-sysname.py import re from netmiko import ConnectHandler from concurrent.fut…

理解字、半字与字节 | 从 CPU 架构到编程实践的数据类型解析

注&#xff1a;本文为 “字、半字、字节” 相关文章合辑。 略作重排&#xff0c;未全校。 如有内容异常&#xff0c;请看原文。 理解计算机体系结构中的字、半字与字节 在计算机科学中&#xff0c;理解“字 (Word)”、“半字 (Half-Word)”和“字节 (Byte)”等基本数据单元的…

数据库实验10 函数存储

数据库实验10 一、实验目的 掌握函数和存储过程的定义方法&#xff0c;包括标量函数、表值函数、存储过程的语法结构。理解函数和存储过程的作用及原理&#xff0c;区分标量函数与表值函数的应用场景&#xff0c;掌握存储过程的参数传递、逻辑控制和错误处理机制。能够熟练运…

2025 RSAC|大语言模型应用风险与厂商攻防新策略

RSA大会全球影响力及2025年LLM热议概览 作为全球规模最大、影响力最深远的网络安全盛会之一&#xff0c;RSA大会每年汇聚数万名业界人士共商安全趋势。在2025 RSAC上&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;尤其是大型语言模型&#xff08;LLM&#x…

网页版部署MySQL + Qwen3-0.5B + Flask + Dify 工作流部署指南

1. 安装MySQL和PyMySQL 安装MySQL # 在Ubuntu/Debian上安装 sudo apt update sudo apt install mysql-server sudo mysql_secure_installation# 启动MySQL服务 sudo systemctl start mysql sudo systemctl enable mysql 安装PyMySQL pip install pymysql 使用 apt 安装 My…

Transformer数学推导——Q55 证明跨层残差跳跃(Cross-Layer Skip Connections)的信息融合效率

该问题归类到Transformer架构问题集——残差与归一化——残差连接。请参考LLM数学推导——Transformer架构问题集。 1. 引言 在深度学习的发展历程中&#xff0c;网络结构的不断创新推动着模型性能的持续提升。跨层残差跳跃&#xff08;Cross-Layer Skip Connections&#xf…

41.寻找缺失的第一个正数:原地哈希算法详解

文章目录 引言问题描述方法思路&#xff1a;原地哈希算法算法步骤 完整代码实现关键代码解析复杂度分析示例说明总结 引言 在算法面试和数据处理中&#xff0c;寻找缺失的第一个正数是一个经典问题。题目要求给定一个未排序的整数数组&#xff0c;找到其中缺失的最小正整数&am…

matlab 中function的用法

matlab 中function的用法 前言介绍1. 基本语法示例&#xff08;1&#xff09;可以直接输出&#xff08;2&#xff09;调用函数 2.输入参数和输出参数示例多输入参数和输出参数定义一个函数&#xff0c;计算两个数的和与差&#xff1a;调用该函数&#xff1a; 3. 默认参数示例 4…

HarmonyOS开发之基于子窗口实现应用内悬浮窗

鸿蒙开发&#xff1a;基于子窗口实现应用内悬浮窗(含完整代码示例) 在现代移动应用中&#xff0c;悬浮窗/悬浮球是一种非常实用的交互方式&#xff0c;常用于展示快捷入口、实时通知、视频播放等场景。例如&#xff1a; 聊天应用中的小助手按钮视频应用的画中画功能游戏或工具类…

可以下载blender/fbx格式模型网站

glbxz.com glbxz.com可以下载blender/fbx格式模型。当然里面有免费的

250505_HTML

HTML 1. HTML5语法与基础标签1.1 HTML5特性1.1.1 空白折叠现象1.1.2 转义字符 1.2 HTML注释1.3 基础标签1.3.1 div标签1.3.2 标题标签1.3.3 段落标签1.3.4 title1.3.5 meta 1.4 html骨架1.4.1 DTD1.4.2 html标签1.4.3 head与body标签 1.5 div标签详解1.5.1 常见class类名 1.6 列…

数据封装的过程

数据的封装过程 传输层 UDP 直接将数据封装为UDP数据报​&#xff0c;添加UDP头部&#xff08;8B&#xff09;。 要点&#xff1a; UDP首部简单&#xff0c;无连接不可靠、无重传、无拥塞控制&#xff0c;适用于实时性要求较高的通讯&#xff1b;不需要源端口或不想计算检…

面向AGI的语言认知操作系统形式化模型

邹晓辉融智学语言数据库体系的数学表达 ——面向AGI的语言认知操作系统形式化模型 1. 基础定义与符号系统 设语言宇宙 L 为所有语言要素的集合&#xff0c;其结构可分解为&#xff1a; LY(言)U(语)A(用) 其中&#xff1a; YPGS &#xff08;音/形/义三元组&#xff09; U⋃…

基于 Spring Boot 瑞吉外卖系统开发(十)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十&#xff09; 修改菜品 修改菜品是在原有的菜品信息的上对菜品信息进行更新&#xff0c;对此修改菜品信息之前需要将原有的菜品信息在修改界面进行展示&#xff0c;然后再对菜品信息进行修改。 修改菜品分为回显菜品信息和更…

Three.js和WebGL区别、应用建议

Three.js 和 WebGL 是用于在浏览器中创建 3D 图形的两种技术,它们之间有明显的区别和适用场景。 对于一般数据展示和模型展示而言,应用更多的是three.js,毕竟相对学习成本来说webGL跟高,需要投入更多的精力和基础功能的开发和验证上。而three.js封装了webGL的功能,开发相对…

【Vue】移动端开发(Uni-app、Taro)

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. Uni-app 与 Taro 简介1.1 什么是 Uni-app&#xff1f;1.2 什么是 Taro&#xff1f;1.3 Uni-app vs Taro&#xff08;对比图&#xff09; 2. 项目初始化与目录结构2.1 初始化 Uni-app 项目2.2 初始化 Taro 项目&…

自定义SpringBoot Starter-笔记

SpringBoot Starter的介绍参考&#xff1a; Spring Boot Starter简介-笔记-CSDN博客。这里介绍如何自定义一个springBoot Starter。 1. 项目结构 创建一个 Maven 项目&#xff0c;结构如下&#xff1a; custom-spring-boot-starter-demo/ ├── custom-hello-jdk/ # jdk模…

linux >!

Linux 中 >! 符号的含义与用法 ‌基本定义‌在 Linux Shell 中,>! 是由 > 和 ! 组合的特殊符号,主要用于 ‌强制覆盖文件‌。其行为与常规的 > 类似,但额外添加了忽略潜在限制的功能。 ‌典型场景‌绕过 noclobber 限制‌: 若 Shell 启用了 noclobber 选项(默…

共铸价值:RWA 联合曲线价值模型,撬动现实资产生态

摘要 本文提出了一种针对真实资产&#xff08;RWA&#xff09;产业的联合曲线激励模型&#xff0c;将劳动与数据贡献映射为曲线价值&#xff0c;并基于固定档位与指数衰减奖励发放总计 2.1亿积分。该模型结合了去中心化定价与平滑递减机制&#xff0c;不仅为早期贡献者提供更高…

java安全入门

文章目录 java基础知识this变量方法可变参数构造方法继承的关键字protected super阻止继承方法重载向上转型和向下转型多态抽象接口static静态字段default方法 包final内部类 java序列化与反序列化反射urldns链动态代理类加载器&#xff08;ClassLoader&#xff09;双亲委派模型…