(力扣)中心扩散法求最长回文子串
生活随笔
收集整理的這篇文章主要介紹了
(力扣)中心扩散法求最长回文子串
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Question:
給定一個(gè)字符串,輸出其中最長(zhǎng)的回文子串。
幾種解法:
暴力枚舉:時(shí)間復(fù)雜度:O(n3)(略)
(雙層枚舉:O(n2)判斷是否為回文串:O(n))
動(dòng)態(tài)規(guī)劃:時(shí)間復(fù)雜度O(n2),空間復(fù)雜度O(n2 )運(yùn)用普遍的解法,此處耗時(shí)較久、空間較大。(略)
中心擴(kuò)散(推薦):
時(shí)間復(fù)雜度O(n2),空間復(fù)雜度O(1)
C++代碼:
中心擴(kuò)散:
用下標(biāo) 【i】【j】 記錄某個(gè)中心位置,將下標(biāo)向兩邊以相同速率擴(kuò)散(i - -,j ++),當(dāng)【i】!=【j】時(shí)停止擴(kuò)散。
在本題的使用思路:
枚舉每個(gè)可能的中心位置(包含子串以一個(gè)元素或兩個(gè)元素為中心位置的情況),每次枚舉調(diào)用 中心擴(kuò)散函數(shù) ,得到當(dāng)前中心位置的回文子串長(zhǎng)度,與已得到的最大回文子串長(zhǎng)度相比較、取最大值,并記錄此串的起始位置 begin,枚舉結(jié)束即可得到答案。
中心擴(kuò)散函數(shù)(expandCenter):
int expandCenter(string& s, int right, int left) {//中心擴(kuò)散函數(shù)int i = right;int j = left;for (; i >= 0 && j <= s.size() - 1;i--,j++) {if (s[i] == s[j]) continue;else break;}return j-i+1-2; //返回當(dāng)前回文串長(zhǎng)(畫圖易得j-i+1為串長(zhǎng),)//(-2是最后跳出循環(huán)坐標(biāo)移動(dòng)的值)}總結(jié)
以上是生活随笔為你收集整理的(力扣)中心扩散法求最长回文子串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 工行贵金属交易时间段
- 下一篇: 回溯和递归的区别(简述)