字符串與算法題詳解:最長回文子串、IP 地址轉換、字符串排序、蛇形矩陣與字符串加密

字符串與算法題詳解:最長回文子串、IP 地址轉換、字符串排序、蛇形矩陣與字符串加密

前言

在編程題訓練中,字符串相關的題目非常常見。本文將結合幾個典型的例題,詳細解析它們的解題思路和實現方式,幫助初學者循序漸進地掌握常用技巧。


一、最長回文子串問題

什么是回文串?

回文串(Palindrome)就是正讀和反讀相同的字符串,例如:

  • ABA 是回文串
  • ABBA 也是回文串
  • ABC 不是回文串

思路解析

要找出一個字符串中最長的回文子串長度,常見方法有兩種:

  1. 中心擴展法

    • 枚舉每一個字符,向兩邊擴展,判斷是否對稱。
    • 分為兩類:奇數長度(如 ABA)、偶數長度(如 ABBA)。
  2. 字符串擴展法(Manacher 算法思想)

    • 在字符串中插入特殊字符(如 #),統一處理奇數和偶數回文的情況。

代碼實現(中心擴展法)

#include <iostream>
#include <string>
using namespace std;int longestPalindrome(string s) {int n = s.size();int maxLen = 1;for (int i = 0; i < n; i++) {// 奇數回文int l = i, r = i;while (l >= 0 && r < n && s[l] == s[r]) {maxLen = max(maxLen, r - l + 1);l--, r++;}// 偶數回文l = i, r = i + 1;while (l >= 0 && r < n && s[l] == s[r]) {maxLen = max(maxLen, r - l + 1);l--, r++;}}return maxLen;
}int main() {string s;cin >> s;cout << longestPalindrome(s) << endl;
}

示例

輸入:

babad

輸出:

3   // 最長回文子串是 "bab" 或 "aba"

好的,你提到的 字符串擴展法(Manacher 算法思想) 是解決最長回文子串問題的經典算法。下面我幫你詳細補充到教程里。


二、字符串擴展法(Manacher 算法思想)

核心思路

在使用中心擴展法時,我們需要分別處理:

  • 奇數長度回文串(如 ABA
  • 偶數長度回文串(如 ABBA

為了統一處理,可以在字符串中插入特殊字符(例如 #),讓所有回文子串都變成奇數長度
比如原始字符串 abba,擴展后變成:

# a # b # b # a #

這樣:

  • 原本的 abba(偶數回文)變成了 #a#b#b#a#,長度為奇數;
  • 原本的 aba(奇數回文)變成了 #a#b#a#,仍然是奇數。

這樣就可以只寫一份擴展邏輯,統一處理。

Manacher 算法原理
  1. 擴展字符串:在每個字符之間加入 #,并在首尾加上邊界字符。
    例如:abba → ^#a#b#b#a#$
    (這里的 ^$ 是哨兵字符,防止越界)

  2. 維護回文半徑數組 P

    • P[i] 表示以位置 i 為中心的回文半徑(不含中心)。
    • 例如 P[i] = 3,表示回文子串長度是 2*3+1=7
  3. 利用對稱性加速

    • 如果當前位置 i 在已知的最大回文右邊界 R 內,那么 P[i] 可以通過對稱點的結果推導。
    • 否則就從中心向兩邊擴展。
  4. 求解最大值

    • 最長回文子串的長度就是 max(P[i]) - 1(因為擴展時多加了 #)。
代碼實現(C++)
#include <iostream>
#include <string>
#include <vector>
using namespace std;string preprocess(const string &s) {string t = "^";for (char c : s) {t += "#" + string(1, c);}t += "#$";return t;
}int longestPalindrome(string s) {string t = preprocess(s);int n = t.size();vector<int> P(n, 0);int C = 0, R = 0; // C: 當前回文中心, R: 當前回文最右端for (int i = 1; i < n - 1; i++) {int mirror = 2 * C - i; // i 關于中心 C 的對稱點if (i < R)P[i] = min(R - i, P[mirror]);// 中心擴展while (t[i + 1 + P[i]] == t[i - 1 - P[i]])P[i]++;// 如果擴展后超過了 R,則更新中心和右邊界if (i + P[i] > R) {C = i;R = i + P[i];}}// 找到最大回文半徑int maxLen = 0;for (int len : P)maxLen = max(maxLen, len);return maxLen;
}int main() {string s;cin >> s;cout << longestPalindrome(s) << endl;
}
示例

輸入:

abba

擴展后:

^#a#b#b#a#$

最終輸出:

4   // 最長回文子串是 "abba"

方法對比
方法時間復雜度思路適用場景
中心擴展法O(n2)枚舉中心點,向兩邊擴展數據量小
Manacher 算法O(n)擴展字符串 + 回文半徑數組大數據量

二、整數與 IP 地址的轉換

基本原理

  • IP 地址由四個數字組成(如 10.0.3.193),每個數字占 8 位,總共 32 位。

  • 可以將其轉化為一個 32 位整數。

  • 例如:

    10.0.3.193 → (10 << 24) + (0 << 16) + (3 << 8) + 193
    

代碼實現

#include <iostream>
using namespace std;int main() {unsigned int a, b, c, d;char dot;cin >> a >> dot >> b >> dot >> c >> dot >> d;unsigned int ip = (a << 24) + (b << 16) + (c << 8) + d;cout << ip << endl;unsigned int num;cin >> num;cout << ((num >> 24) & 255) << "."<< ((num >> 16) & 255) << "."<< ((num >> 8) & 255) << "."<< (num & 255) << endl;
}

三、字符串排序

題目解析

給定一個字符串,要求按 ASCII 值升序排序

代碼實現

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;int main() {string s;cin >> s;sort(s.begin(), s.end());cout << s << endl;
}

示例

輸入:

dcba321

輸出:

123abcd

四、蛇形矩陣(找規律問題)

問題描述

輸入一個整數 n,構造一個 n × n 的蛇形矩陣,只輸出上三角部分。

例如 n = 5 時:

1  3  6  10 15
2  5  9  14
4  8  13
7  12
11

思路

  • 第 1 行輸出 1 開始,每個元素與前一個差值依次增加。
  • 每行輸出的數字個數遞減。

代碼實現

#include <iostream>
using namespace std;int main() {int n;cin >> n;for (int i = 1; i <= n; i++) {int num = i;for (int j = i; j <= n; j++) {cout << num << " ";num += j;}cout << endl;}
}

五、字符串加密

加密規則

  1. 選擇一個單詞作為密鑰,去掉重復字母。
  2. 用密鑰替換字母表前綴,構造加密字母表。
  3. 明文中的每個字母替換為加密表對應字母。

示例

密鑰:attack
明文:attack
加密:txyz...

代碼實現

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;int main() {string key, text;cin >> key >> text;string dict;bool used[26] = {false};for (char c : key) {if (!used[c - 'a']) {dict += c;used[c - 'a'] = true;}}for (char c = 'a'; c <= 'z'; c++) {if (!used[c - 'a']) dict += c;}unordered_map<char, char> mp;for (int i = 0; i < 26; i++) {mp['a' + i] = dict[i];}for (char c : text) {if (islower(c)) cout << mp[c];else if (isupper(c)) cout << (char)toupper(mp[tolower(c)]);else cout << c;}cout << endl;
}

總結

本文從幾個典型題目出發,系統性講解了字符串相關的算法題:

  • 最長回文子串:中心擴展法、字符串擴展。
  • IP 地址與整數轉換:移位運算與掩碼處理。
  • 字符串排序:利用 sort
  • 蛇形矩陣:數學找規律。
  • 字符串加密:構造映射表。

掌握這些題目的思路和實現,可以幫助我們快速解決更多字符串相關問題。

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

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

相關文章

從協同設計到綠色制造:工業云渲染的價值閉環

在智能制造、建筑工程、能源電力、船舶海工等工業場景中&#xff0c;3D可視化已從傳統的桌面端逐步向Web端遷移&#xff0c;Web 3D憑借其跨平臺、輕量化、實時交互等特性&#xff0c;已成為企業構建數字孿生、實現遠程協作、推動云端交付的重要工具。這場技術變革不僅改變了工業…

算法第五十一天:圖論part02(第十一章)

1.島嶼數量 99. 島嶼數量 &#x1f31f; 思路總結 — DFS 版 1?? 問題本質 給定一個二維矩陣 grid&#xff0c;1 表示陸地&#xff0c;0 表示水 統計島嶼數量&#xff0c;每個島嶼由上下左右相鄰的陸地組成 本質是 在二維網格中找連通塊 的問題。 2?? 核心思路 遍歷矩陣…

杰里708n tws api 簡介

/** 通過搜索碼搜索tws設備*/int tws_api_search_sibling_by_code();/**打開可發現, 可連接&#xff0c;可被手機和tws搜索到*/int tws_api_wait_pair_by_code(u16 code, const char *name, int timeout_ms);int tws_api_wait_pair_by_ble(u16 code, const char *name, int tim…

高調光比 LED 恒流驅動芯片方案詳解AP5165B:36V/1A

AP5165B 是深圳市世微半導體有限公司推出的一款高性能、連續電流模式的降壓型&#xff08;Buck&#xff09;LED 恒流驅動芯片。該芯片適用于輸入電壓高于 LED 電壓的應用場景&#xff0c;可驅動單顆或多顆串聯的 LED&#xff0c;輸出電流最高可達 1A&#xff0c;廣泛用于非隔離…

【從零構建企業級線程池管理系統:Python并發編程實戰指南】

從零構建企業級線程池管理系統&#xff1a;Python并發編程實戰指南 技術博客 | 深入探索Python并發編程、Web開發與現代軟件架構設計的完整實踐 &#x1f680; 項目背景 在當今高并發的互聯網時代&#xff0c;線程池作為并發編程的核心組件&#xff0c;其管理和監控能力直接影…

飛牛系統總是死機,安裝個工具查看一下日志

崩潰轉儲 (kernel crash dump)如果你懷疑是內核 panic&#xff0c;可以開啟 kdump 或 kernel crash dump。 安裝&#xff1a;sudo apt install kdump-tools # Debian/Ubuntu sudo systemctl enable kdump 下次死機時&#xff0c;系統會把內存 dump 到 /var/crash 里。sudo syst…

2025年AI Agent技術深度解析:原理、應用與未來趨勢

一、引言隨著人工智能技術的飛速發展&#xff0c;AI Agent&#xff08;智能體&#xff09;作為人工智能領域的重要分支&#xff0c;正逐漸成為推動各行業智能化轉型的關鍵力量。AI Agent具備自主感知、決策和執行能力&#xff0c;能夠在復雜環境中完成特定任務&#xff0c;為人…

linux內核 - 內存分配機制介紹

在linux內核中&#xff0c;下面這張圖說明了系統中存在一個可以滿足各種內存請求的分配機制。根據你需要內存的用途&#xff0c;你可以選擇最接近你目標的分配方式。最底層、最基礎的分配器是 頁分配器&#xff08;page allocator&#xff09;&#xff0c;它以頁為單位分配內存…

PyTorch生成式人工智能——ACGAN詳解與實現

PyTorch生成式人工智能——ACGAN詳解與實現0. 前言1. ACGAN 簡介1.1 ACGAN 技術原理1.2 ACGAN 核心思想1.3 損失函數2. 模型訓練流程3. 使用 PyTorch 構建 ACGAN3.1 數據處理3.2 模型構建3.3 模型訓練3.4 模型測試相關鏈接0. 前言 在生成對抗網絡 (Generative Adversarial Net…

Python + 淘寶 API 開發:自動化采集商品數據的完整流程?

在電商數據分析、競品監控和市場調研等場景中&#xff0c;高效采集淘寶商品數據是關鍵環節。本文將詳細介紹如何利用 Python 結合 API&#xff0c;構建一套自動化的商品數據采集系統&#xff0c;涵蓋從 API 申請到數據存儲的完整流程&#xff0c;并提供可直接運行的代碼實現。?…

2025.8.21總結

工作一年多了&#xff0c;在這期間&#xff0c;確實也有不少壓力&#xff0c;但每當工作有壓力的時候&#xff0c;最后面都會解決。好像每次遇到解決不了的事情&#xff0c;都有同事給我兜底。這種壓力&#xff0c;確實會加速一個人的成長。這種狼性文化&#xff0c;這種環境&a…

VS2022 - C#程序簡單打包操作

文章目錄VS2022 - C#程序簡單打包操作概述筆記實驗過程新建工程讓依賴的運行時程序安裝包在安裝時運行(如果發現運行時不能每次都安裝程序&#xff0c;就不要做這步)關于”運行時安裝程序無法每次都安裝成功“的應對知識點嘗試打包舊工程bug修復從需求屬性中&#xff0c;可以原…

在JAVA中如何給Main方法傳參?

一、在IDEA中進行傳參&#xff1a;先創建一個類&#xff1a;MainTestimport java.util.Arrays;public class MainTest {public static void main(String[] args) {System.out.println(args.length);System.out.println(Arrays.toString(args));} }1.IDEA ---> 在運行的按鈕上…

ORACLE中如何批量重置序列

背景&#xff1a;數據庫所有序列都重置為1了&#xff0c;所以要將所有的序列都更新為對應的表主鍵&#xff08;這里是id&#xff09;的最大值1。我這里序列的規則是SEQ_表名。BEGINENHANCED_SYNC_SEQUENCES(WJ_CPP); -- 替換為你的模式名 END; / CREATE OR REPLACE PROCEDURE E…

公號文章排版教程:圖文雙排、添加圖片超鏈接、往期推薦、推文采集(2025-08-21)

文章目錄 排版的基本原則 I 圖片超鏈接 方式1: 利用公號原生編輯器 方式2:在CSDN平臺使用markdown編輯器, 利用標簽實現圖片鏈接。 II 排版小技巧 自定義頁面模版教程 使用壹伴進行文章素材的采集 美編助手的往期推薦還不錯 利用365編輯器創建圖文雙排效果 排版的基本原則 親…

計算兩幅圖像在特定交點位置的置信度評分。置信度評分反映了該位置特征匹配的可靠性,通常用于圖像處理任務(如特征匹配、立體視覺等)

這段代碼定義了一個名為compute_confidence的函數&#xff0c;用于計算兩幅圖像在特定交點位置的置信度評分。置信度評分反映了該位置特征匹配的可靠性&#xff0c;通常用于圖像處理任務&#xff08;如特征匹配、立體視覺等&#xff09;。以下是逐部分解析&#xff1a; 3. 結果…

計算機視覺第一課opencv(三)保姆級教學

簡介 計算機視覺第一課opencv&#xff08;一&#xff09;保姆級教學 計算機視覺第一課opencv&#xff08;二&#xff09;保姆級教學 今天繼續學習opencv。 一、 圖像形態學 什么是形態學&#xff1a;圖像形態學是一種處理圖像形狀特征的圖像處理技術&#xff0c;主要用于描…

24.早期目標檢測

早期目標檢測 第一步&#xff0c;計算機圖形學做初步大量候選框&#xff0c;把物體圈出來 第二步&#xff0c;依次將所有的候選框圖片&#xff0c;輸入到分類模型進行判斷 選擇性搜索 選擇搜索算法&#xff08;Selective Search&#xff09;&#xff0c;是一種熟知的計算機圖像…

Java基礎知識點匯總(三)

一、面向對象的特征有哪些方面 Java中面向對象的特征主要包括以下四個核心方面&#xff1a;封裝&#xff08;Encapsulation&#xff09; 封裝是指將對象的屬性&#xff08;數據&#xff09;和方法&#xff08;操作&#xff09;捆綁在一起&#xff0c;隱藏對象的內部實現細節&am…

GEO優化專家孟慶濤:讓AI“聰明”選擇,為企業“精準”生長

在生成式AI席卷全球的今天&#xff0c;企業最常遇到的困惑或許是&#xff1a;“為什么我的AI生成內容總像‘模板套娃’&#xff1f;”“用戶明明想要A&#xff0c;AI卻拼命輸出B&#xff1f;”當生成式AI從“能用”邁向“好用”的關鍵階段&#xff0c;如何讓AI真正理解用戶需求…