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.pswp.cn/news/904471.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904471.shtml
英文地址,請注明出處:http://en.pswp.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;雙親委派模型…