【位運算】【前綴和】個人練習-Leetcode-1177. Can Make Palindrome from Substring

題目鏈接:https://leetcode.cn/problems/can-make-palindrome-from-substring/description/

題目大意:給出一個字符串s,每次query給出l, r, k,要求判斷子串s[l:r+1]在經過k次操作后是否能變為回文串。一次操作可以將子串內的一個字符變為任意一個其他字符。并且子串順序可以任意改變。

思路:因為有很多query,自然想到會有重復計算,要檢查超時,那么就想到前綴和。用pre[j][i]記錄到i為止字母j出現的次數。那么子串內字母j出現的次數即為pre[j][r+1-l]

對于子串,如果長度為奇數,那么回文與否與中間的字符無關,我們可以忽略。因此處理的總是一個總長度為偶數的子串。統計子串中每個字母的出現次數,可以知道,【奇數出現的次數】必然是偶數,因為只有偶數個奇數+若干偶數才能使得和(子串總長度)為偶數。

那么對于cnt個出現奇數次的字母,我們進行k次操作可以最多讓2*k長度的子串變為回文。而對于出現偶數次的字母,只需將其對稱排列即可。因此判斷條件變為cnt / 2 <= k

完整代碼

class Solution {
public:vector<bool> canMakePaliQueries(string s, vector<vector<int>>& queries) {int N = s.length();int pre[26][10001] = {};for (int i = 0; i < N; i++) {int idx = s[i]-'a';pre[idx][i+1] = pre[idx][i]+1;for (int j = 0; j < 26; j++) {if (j != idx && i > 0)pre[j][i+1] = pre[j][i];}}vector<bool> res;for (auto q: queries) {int l = q[0], r = q[1], k = q[2];char mid = s[(l+r)/2];bool flag = (r+1-l)%2;int arr[26] = {};if (flag)arr[mid-'a']--;int cnt = 0;for (int j = 0; j < 26; j++) {arr[j] += pre[j][r+1] - pre[j][l];if (arr[j] & 1 == 1) {cnt++;}}if (cnt / 2 <= k) {res.emplace_back(true);}else {res.emplace_back(false);}}return res;}
};

然而,碰到大的測試樣例的時候會超時…那么就不得不求助高效的位運算了。

我們用一個二進制數組存儲前綴和,每個二進制數一共26位,代表某個字母在i位置前的奇偶性。奇偶性運算用異或操作^來實現。

        int N = s.length();vector<int> pre(N+1, 0);for (int i = 0; i < N; i++) {pre[i+1] = pre[i] ^ (1 << s[i]-'a');            }

如何統計子串中的字母的奇數的個數呢?這就是數一下【代表該區間的二進制數】(通過前綴和做差得到)中1的個數。

            int l = q[0], r = q[1], k = q[2];int cnt = 0;int x = pre[r+1] ^ pre[l];while (x > 0) {x &= x - 1;cnt++;}

x &= x-1操作將 x 的二進制表示中最低位的 1 翻轉成 0,并將所有更低位的位都清零。這是一個位運算技巧,快速計算二進制數中1的個數。

另外,由于乘法比除法更加快速,我們就不考慮是否忽略子串最中間的字母了,即使它使得x1的個數增加了,也只不過增加1而已,我們將能夠處理的上限改為2*k+1即可。

            if (cnt <= 2*k+1)res.emplace_back(true);elseres.emplace_back(false);

完整代碼

class Solution {
public:vector<bool> canMakePaliQueries(string s, vector<vector<int>>& queries) {int N = s.length();vector<int> pre(N+1, 0);for (int i = 0; i < N; i++) {pre[i+1] = pre[i] ^ (1 << s[i]-'a');            }vector<bool> res;for (auto q: queries) {int l = q[0], r = q[1], k = q[2];int cnt = 0;int x = pre[r+1] ^ pre[l];while (x > 0) {x &= x - 1;cnt++;}if (cnt <= 2*k+1)res.emplace_back(true);elseres.emplace_back(false);}return res;}
};

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

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

相關文章

mysql 數據庫在liunx 上的備份和恢復

一. mysql 數據庫備份 sh 腳本 1. vim sqlback.sh #!/bin/bashUSER"root" #賬號 PASSWORD"123456" #密碼 DATABASE"test" #數據庫名 BACKUP_DIR"/home/dev/mysql" #備份存的目錄 TIMESTAMP$(date "%F") …

搭建python虛擬環境,并在VSCode中使用

創建環境 python -m venv E:\python\flask\venv激活環境 運行下圖所示的bat文件 退出環境 執行下面的語句 deactivateVSCode中配置&#xff1a; ①使用CTRLshiftp命令&#xff0c;使用CTRLshiftp命令&#xff0c;輸入&#xff1a; Python: Select Interpreter②選擇之前創建…

【計算視覺】學習計算機視覺你不得不膜拜的CVPR大神:何凱明

目錄 第一章&#xff1a;CVPR——計算機視覺的終極擂臺 第二章&#xff1a;何凱明——計算機視覺領域的耀眼星辰 第三章&#xff1a;高引用論文——計算機視覺研究的璀璨星辰 第四章&#xff1a;何凱明的CVPR論文——深度學習的探索之旅 第五章&#xff1a;結語——向何凱…

翻譯《The Old New Thing》- Why isn’t there a SendThreadMessage function?

Why isnt there a SendThreadMessage function? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081223-00/?p19743 Raymond Chen 2008年12月23日 為什么沒有 SendThreadMessage 函數&#xff1f; 簡要 文章討論了 Windows 中不存在 Sen…

WHAT - 發布訂閱

目錄 一、常見實現方案1.1 使用事件發射器&#xff08;Event Emitter&#xff09;1.2 自定義事件系統&#xff08;EventBus&#xff09;1.3 使用庫如 PubSubJS1.4 使用框架內置的狀態管理工具Vue.jsReact (使用 Context API 或 Redux) 二、先后關系2.1 緩存事件數據2.2 使用 Re…

React hooks動態配置側邊欄

React hooks根據不同需求 還有不同的角色 動態的去配置側邊欄 需求&#xff1a; 點擊某個按鈕是一套側邊欄 &#xff0c;不同角色&#xff08;比如管理員之類的權限高一點&#xff09;比普通用戶多個側邊欄 然后點擊另一個按鈕是另一套側邊欄 此時&#xff0c;就需要動態的去…

【React】classnames 優化類名控制

1. 介紹 classnames是一個簡單的JS庫&#xff0c;可以非常方便的通過條件動態的控制class類名的顯示 ClassNames是一個用于有條件處理classname字符串連接的庫 簡單來說就是動態地去操作類名&#xff0c;把符合條件的類名粘在一起 現在的問題&#xff1a;字符串的拼接方式不…

KMeans聚類分析星

1. datasample initial_centroids datasample(data, k, Replace, false); 是MATLAB中的命令&#xff0c;用于從數據集data中隨機抽取k個樣本作為初始聚類匯總新&#xff0c;并且抽取時不放回。 datasample&#xff1a;是MATLAB中的函數&#xff0c;用于從數組中隨機抽取樣本d…

halcon算子之prepare_object_model_3d詳解

為某一操作準備三維對象模型。 Description 操作符prepare_object_model_3d準備3D對象模型ObjectModel3D,用于下面目的中給出的操作。它計算操作所需的值并將其存儲在ObjectModel3D中,從而加快了后續操作。沒有必要調用prepare_object_model_3d。但是,如果要多次使用3D對象…

5、js關于數組的常用方法(19種)

一、改變原數組的方法 1.push&#xff08;&#xff09; 末尾添加數據 語法&#xff1a; arr.push(要插入的數據可以多個) // push 尾部添加數據const arr [1,2,3,4,5];arr.push(6,7);console.log(arr);//(7) [1, 2, 3, 4, 5, 6, 7]2. pop&#xff08;&#xff09; 末尾刪除一…

大疆智圖_空三二維重建成果傳輸

一、軟件環境 1.1 所需軟件 1、 大疆智圖&#xff1a;點擊下載&#xff1b; ??2、 ArcGIS Pro 3.1.5&#xff1a;點擊下載&#xff0c;建議使用IDM或Aria2等多線程下載器&#xff1b; ??3、 IDM下載器&#xff1a;點擊下載&#xff0c;或自行搜索&#xff1b; ??4、 Fas…

探索 Noisee AI 的奇妙世界與變現之旅

日賺800&#xff0c;利用淘寶/閑魚進行AI音樂售賣實操 如何讓AI生成自己喜歡的歌曲-AI音樂創作的正確方式 抖音主播/電商人員有福了&#xff0c;利用Suno創作產品宣傳&#xff0c;讓產品動起來-小米Su7 用sunoAI寫粵語歌的方法&#xff0c;博主已經親自實踐可行 五音不全也…

[經驗] 潿洲島在廣西嗎 #職場發展#知識分享#媒體

潿洲島在廣西嗎 廣西潿洲島&#xff0c;是中國南海上的一顆閃亮明珠&#xff0c;位于廣西北部灣沿海&#xff0c;東經108.71度&#xff0c;北緯21.54度&#xff0c;距離北海市區30公里&#xff0c;是中國最大的海島之一&#xff0c;風景秀麗&#xff0c;氣候溫和。島上山青水秀…

!力扣3. 無重復字符的最長子串

給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長子串的長度。 示例 1: 輸入: s "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是"abc"&#xff0c;所以其長度為 3 示例 2: 輸入: s "bbbbb" 輸出: 1 …

PCE自動裝機

服務端和客戶端 pxe&#xff1a;c/s模式&#xff0c;允許客戶端通過遠程服務器(服務端)下載引導鏡像&#xff0c;加載安裝吻技安&#xff0c;實現自動化安裝操作系統。 無人值守&#xff1a;安裝選項不需要認為干預&#xff0c;可以自動化實現。 pxe優點&#xff1a; 1.規模…

Overall timing accuracy 和Edge placement accuracy 理解

在電子設計自動化(EDA)、集成電路(IC)制造和高速數字電路設計領域,"Overall Timing Accuracy" 和 "Edge Placement Accuracy" 是兩個關鍵的性能指標,它們對于確保電路的功能正確性和性能至關重要。 當涉及到“Overall timing accuracy”(總體時序精度)…

最小相位系統

最小相位系統 1、傳遞函數 一個線性系統的響應。 比如一個RC低通濾波器&#xff1a; 交流分量在電容的充放電中被濾除掉&#xff0c;通過設置電容器的電容值&#xff0c;以及電阻值&#xff0c;能夠控制這種濾除能力&#xff0c;這個參數為RC。 電容的電抗為 1 / j w C 1/j…

單片機+TN901非接觸式紅外測溫設計

摘要 溫度測量技術應用十分廣泛&#xff0c;而且在現代設備故障檢測領域中也是一項非常重要的技術。但在某些應用領域中&#xff0c;要求測量溫度用的傳感器不能與被測物體相接觸&#xff0c;這就需要一種非接觸的測溫方式來滿足上述測溫需求。本論文正是應上述實際需求而設計的…

C語言實戰:貪吃蛇(萬字詳解)

&#x1f4a1;目錄 效果圖 界面設計思路 1. 基本布局 2. 視覺元素 游戲機制設計 基本規則 游戲代碼 前期準備 游戲代碼詳解 數據結構設計 宏定義 數據結構定義 函數原型&#xff08;詳見后文&#xff09; 主函數代碼 核心代碼 Review 效果圖 界面設計思路 1. 基…

轉型AI產品經理(4):“認知負荷”如何應用在Chatbot產品

認知負荷理論主要探討在學習過程中&#xff0c;人腦處理信息的有限容量以及如何優化信息的呈現方式以促進學習。認知負荷定律認為&#xff0c;學習者的工作記憶容量是有限的&#xff0c;而不同類型的認知任務會對工作記憶產生不同程度的負荷&#xff0c;從而影響學習效果。以下…