Leetcode 3518. Smallest Palindromic Rearrangement II

  • Leetcode 3518. Smallest Palindromic Rearrangement II
    • 1. 解題思路
    • 2. 代碼實現
  • 題目鏈接:Leetcode 3518. Smallest Palindromic Rearrangement II

1. 解題思路

這一題是題目Leetcode 3517. Smallest Palindromic Rearrangement I的升級版本,其主要的升級點就是要求按字典序排序第 k k k小的字符串,而不是簡單的直接獲取最小的字符串了。因此處理起來事實上要多做的部分也就是如何求這個第 k k k小的字符串。

我們首先看一下前置的內容,即首先我們需要找到這個回文的唯一部分,即其前半段所包含的全部字符,這個我們只需要將原始字符串進行一下字符統計,然后取所有字符的一半即可。此時,我們將其任意排列,然后拼湊其反向字符即可得到一個滿足條件的回文。

因此,要求其第 k k k小的回文字符串,事實上也就是求這個前半段字符的第 k k k小的字符串排列。

顯然,經過簡單的數學知識,我們已知一個長度為 n n n的字符串序列,其可能的字符排列的種類一共有:

N = n ! Π i = 1 m n i ! N = \frac{n!}{\mathop{\Pi}\limits_{i=1}^{m}n_i!} N=i=1Πm?ni?!n!?

因此,我們只需要一個遞推算法,逐一考察從頭開始每一個元素依次從小到大擺放各個字符時其剩余的字符串排列的數目是否大于剩余需要的字符串排列數目即可。

用偽代碼表示即為:

def get_kth_string(s, k):cnt = Counter(s)ans = ""while k > 1:for ch in [a..z]:cnt[ch] -= 1m = factorial(n)for _ch in [a..z]:m = m // factorial[_ch]if m >= k:ans += chelse:k -= mcnt[ch] += 1ans += "".join(ch * cnt[ch] for ch in [a..z])return ans

整體的算法復雜度就是 O ( N × 2 6 2 ) O(N \times 26^2) O(N×262)

2. 代碼實現

給出最終的python代碼實現如下:

class Solution:def get_kth_smallest_string(self, s, k):cnt = Counter(s)n = len(s)def c(n, m, upper):m = min(n-m, m)ans = 1for i in range(m):ans = ans * (n-i) // (i+1)if ans >= upper:return ansreturn ansdef get_count(cnt, upper):n = sum(cnt.values())ans = 1for m in cnt.values():ans = ans * c(n, m, upper)n -= mif ans >= upper:return ansreturn anstot = get_count(cnt, k)if k == 1:return "".join(sorted(s))elif tot < k:return ""def dfs(idx, k):if k == 1:return "".join([ch * cnt[ch] for ch in string.ascii_lowercase])for ch in string.ascii_lowercase:if cnt[ch] > 0:cnt[ch] -= 1tot = get_count(cnt, k)if tot >= k:return ch + dfs(idx+1, k)k -= totcnt[ch] += 1return ""return dfs(0, k)def smallestPalindrome(self, s: str, k: int) -> str:cnt = Counter(s)mid = ""ans = ""for ch in string.ascii_lowercase:ans += ch * (cnt[ch] // 2)if cnt[ch] % 2 == 1:mid = chif ans == "":return mid if k == 1 else ""ans = self.get_kth_smallest_string(ans, k)return ans + mid + ans[::-1] if ans != "" else ""

提交代碼評測得到:耗時1055ms,占用內存19.4MB。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77021.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77021.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77021.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大模型——Crawl4AI 中的數據提取策略

大模型——Crawl4AI 中的數據提取策略 在本章中,將詳細介紹在 Crawl4AI 中可用的數據提取策略。這些策略包括: LLMExtractionStrategy:用于詳細內容提取。JsonCssExtractionStrategy:使用 CSS 選擇器進行結構化數據檢索。CosineStrategy:基于余弦相似性進行有效的語義分段…

職坐標解碼互聯網行業轉型發展新動能

當前&#xff0c;互聯網行業正以前所未有的速度重塑全球產業格局。工信部最新數據顯示&#xff0c;我國互聯網企業營收連續三年保持雙位數增長&#xff0c;其中百強企業在人工智能、物聯網等領域的投入強度同比提升40%&#xff0c;展現出強勁的技術引領力。與此同時&#xff0c…

linux多線(進)程編程——(4)進程間的傳音術(命名管道)

前言&#xff08;前情回顧&#xff09; 進程君&#xff08;父進程&#xff09;在開發出匿名管道這門傳音術后&#xff0c;解決了和自己孩子&#xff08;子進程&#xff09;間的溝通問題&#xff0c;父子關系趨于融洽。和孩子溝通后&#xff0c;進程君發現&#xff0c;自己脫離…

在IDEA里面建立maven項目(便于java web使用)

具體步驟&#xff1a; 第一次有的電腦你再創建項目的時候右下角會提醒你彈窗&#xff1a;讓你下載沒有的東西 一定要下載&#xff01;&#xff01;可能會很慢 運行結果&#xff1a; 因為他是默認的8080端口所以在運行的時候輸入的url如下圖&#xff1a; 新建了一個controller代…

【13】數據結構之樹結構篇章

目錄標題 樹Tree樹的定義樹的基本概念樹的存儲結構雙親表示法孩子表示法孩子兄弟表示法 二叉樹二叉樹與度不超過&#xff12;的普通樹的不同之處二叉樹的基本形態二叉樹的分類二叉樹的性質 二叉樹的順序存儲二叉樹的鏈式存儲二叉樹的鏈式存儲的結點結構樹的遍歷先序遍歷中序遍歷…

雷達生命探測儀,地震救援的生命探測先鋒|鼎躍安全

在地震、山體滑坡、坍塌建筑等突發災害中&#xff0c;會嚴重摧毀建筑物&#xff0c;造成倒塌和人員被困&#xff1b;在瓦礫堆、混凝土板層中&#xff0c;受困人員的生命安全常常面臨嚴峻威脅。傳統救援手段通常存在響應時間長、監測精度有限等不足。 救援現場往往環境復雜&…

512天,倔強生長:一位技術創作者的獨白

親愛的讀者與同行者&#xff1a; 我是倔強的石頭_&#xff0c;今天是我在CSDN成為創作者的第512天。當系統提示我寫下這篇紀念日文章時&#xff0c;我恍惚間想起了2023年11月19日的那個夜晚——指尖敲下《開端——》的標題&#xff0c;忐忑又堅定地按下了“發布”鍵。那時的我…

數據結構*集合框架順序表-ArrayList

集合框架 常見的集合框架 什么是順序表 順序表是一種線性表數據結構&#xff0c;它借助一組連續的存儲單元來依次存儲線性表中的數據元素。一般情況下采用數組存儲。 在數組上完成數據的增刪查改。 自定義簡易版的順序表 代碼展示&#xff1a; public interface IArray…

使用openpyxl時的一些注意點

一、是否需要close()&#xff1f; 在使用 openpyxl 時&#xff0c;wb.save() 后一般不需要再手動調用 wb.close()。wb.save() 會自動處理文件寫入和釋放。 如果是使用openpyxl.load_workbook(filename, read_onlyTrue) 打開了一個只讀模式的工作簿&#xff0c;此時會建立文件…

Python爬蟲第11節-解析庫Beautiful Soup的使用上篇

目錄 前言 一、Beautiful Soup 簡介 1.1 Beautiful Soup概述 1.2 準備工作 1.3 解析器 二、基本使用 三、節點選擇器的使用 3.1 選擇元素 3.2 提取信息 3.2.1 獲取名稱 3.2.2 獲取屬性 3.2.3 獲取內容 3.3 嵌套選擇 3.4 關聯選擇 3.4.1 子節點和子孫節點 3.4.2…

【Docker-13】Docker Container容器

Docker Container&#xff08;容器&#xff09; 一、什么是容器&#xff1f; 通俗地講&#xff0c;容器是鏡像的運行實體。鏡像是靜態的只讀文件&#xff0c;而容器帶有運行時需要的可寫文件層&#xff0c;并且容器中的進程屬于運行狀態。即容器運行著真正的應用進程。容器有…

Spring Cache(筆記)

簡介&#xff1a; 常用注解&#xff1a;

大模型Qwen32b(FP16精度)部署所需的顯存大小和并發數計算分析

大家好&#xff0c;我是微學AI&#xff0c;今天給大家介紹一下大模型Qwen32b(FP16精度)部署所需的顯存大小和并發計算分析。 文章目錄 1. 大模型顯存需求分析1.1 模型參數與顯存占用1.2 不同精度對顯存的影響 2. 不同顯卡配置下的并發能力2.1 80G顯卡并發能力2.2 64G顯卡并發能…

【euclid】10.2 2D變換模塊(transform2d.rs)Arbitrary trait

源碼 #[cfg(feature "arbitrary")] impl<a, T, Src, Dst> arbitrary::Arbitrary<a> for Transform2D<T, Src, Dst> whereT: arbitrary::Arbitrary<a>, {fn arbitrary(u: &mut arbitrary::Unstructured<a>) -> arbitrary::Res…

MAC Mini M4 上測試Detectron2 圖像識別庫

斷斷續續地做圖像識別的應用&#xff0c;使用過各種圖像識別算法&#xff0c;一開始使用openCV 做教室學生計數的程序。以后又使用YOLO 做醫學傷口檢測程序。最近&#xff0c;開始使用meta 公司的Detectron2.打算做OCR 文檔結構分析 Detectron2 的開發者是 Meta 的 Facebook AI…

一天時間,我用AI(deepseek)做了一個配色網站

前言 最近在開發顏色搭配主題的相關H5和小程序&#xff0c;想到需要補充一個web網站&#xff0c;因此有了這篇文章。 一、確定需求 向AI要答案之前&#xff0c;一定要清楚自己想要做什么。如果你沒有100%了解自己的需求&#xff0c;可以先讓AI幫你理清邏輯和思路&#xff0c;…

機器視覺用消色差雙合透鏡

光學系統案例&#xff1a;機器視覺用消色差雙合透鏡 一、設計規格 1. 應用場景&#xff1a;專為工業相機成像而設計&#xff0c;工作于可見光波段&#xff0c;旨在滿足該領域對高精度成像的需求。 2. 核心參數&#xff1a; ? 焦距&#xff1a;精確要求達到 50 mm 1%&#…

批量歸一化(Batch Normalization)原理與PyTorch實現

批量歸一化&#xff08;Batch Normalization&#xff09;是加速深度神經網絡訓練的常用技術。本文通過Fashion-MNIST數據集&#xff0c;演示如何從零實現批量歸一化&#xff0c;并對比PyTorch內置API的簡潔實現方式。 1. 從零實現批量歸一化 1.1 批量歸一化函數實現 import t…

feedback

這個文件 lib/pages/feedback/index.dart 是一個反饋/留言表單頁面的實現&#xff0c;主要功能是&#xff1a; 表單收集功能&#xff1a; 真實姓名&#xff08;必填&#xff09;聯系電話&#xff08;必填&#xff0c;需要驗證手機號格式&#xff09;電子郵箱&#xff08;選填&a…

數據倉庫標準庫模型架構相關概念淺講

數據倉庫與模型體系及相關概念 數據倉庫與數據庫的區別可參考&#xff1a;數據庫與數據倉庫的區別及關系_數據倉庫和數據庫-CSDN博客 總之&#xff0c;數據庫是為捕獲數據而設計&#xff0c;數據倉庫是為分析數據而設計 數據倉庫集成工具 在一些大廠中&#xff0c;其會有自…