日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

回文子串个数

發(fā)布時間:2024/4/18 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回文子串个数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 確定dp數(shù)組(dp table)以及下標(biāo)的含義

布爾類型的dp[i][j]:表示區(qū)間范圍[i,j](注意是左閉右閉)的子串是否是回文子串,如果是dp[i][j]為true,否則為false。

2. 確定遞推公式

在確定遞推公式時,整體上有兩種情況,就是s[i]與s[j]相等,s[i]與s[j]不相等這兩種。

當(dāng)s[i]與s[j]不相等,dp[i][j]一定是false。

當(dāng)s[i]與s[j]相等時,又分為如下三種情況

  • 情況一:下標(biāo)i 與 j相同,同一個字符例如a,當(dāng)然是回文子串
  • 情況二:下標(biāo)i 與 j相差為1,例如aa,也是文子串
  • 情況三:下標(biāo):i 與 j相差大于1的時候,例如cabac,此時s[i]與s[j]已經(jīng)相同了,我們看i到j(luò)區(qū)間是不是回文子串就看aba是不是回文就可以了,那么aba的區(qū)間就是 i+1 與 j-1區(qū)間,這個區(qū)間是不是回文就看dp[i + 1][j - 1]是否為true。

3. dp數(shù)組如何初始化

dp[i][j]可以初始化為true么? 當(dāng)然不行,怎能剛開始就全都匹配上了。

所以dp[i][j]初始化為false。

4. 確定遍歷順序

首先從遞推公式中可以看出,情況三是根據(jù)dp[i + 1][j - 1]是否為true,在對dp[i][j]進(jìn)行賦值true的。

dp[i + 1][j - 1] 在 dp[i][j]的左下角,如圖:

如果這矩陣是從上到下,從左到右遍歷,那么會用到?jīng)]有計算過的dp[i + 1][j - 1],也就是根據(jù)不確定是不是回文的區(qū)間[i+1,j-1],來判斷了[i,j]是不是回文,那結(jié)果一定是不對的。

所以一定要從下到上,從左到右遍歷,這樣保證dp[i + 1][j - 1]都是經(jīng)過計算的

5. 舉例推導(dǎo)dp數(shù)組

舉例,輸入:“aaa”,dp[i][j]狀態(tài)如下:

圖中有6個true,所以就是有6個回文子串。

注意因為dp[i][j]的定義,所以j一定是大于等于i的,那么在填充dp[i][j]的時候一定是只填充右上半部分

以上分析完畢,C++代碼如下:

class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(),vector<bool>(s.size(),false));int res=0;for(int ii=s.size()-1;ii>=0;ii--){//從下到上遍歷for(int jj=ii;jj<s.size();jj++){//從左到右遍歷if(s[ii]!=s[jj]) dp[ii][jj]=false;else if(s[ii]==s[jj]){if(jj-ii<=2){dp[ii][jj]=true;res++;} else if(dp[ii+1][jj-1]){res++;dp[ii][jj]=true;}}}}return res;} };

簡潔版

class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result = 0;for (int i = s.size() - 1; i >= 0; i--) {for (int j = i; j < s.size(); j++) {if (s[i] == s[j] && (j - i <= 1 || dp[i + 1][j - 1])) {result++;dp[i][j] = true;}}}return result;} }; 時間復(fù)雜度:O(n^2) 空間復(fù)雜度:O(n^2)

雙指針法

動態(tài)規(guī)劃的空間復(fù)雜度是偏高的,我們再看一下雙指針法。

首先確定回文串,就是找中心然后想兩邊擴(kuò)散看是不是對稱的就可以了。

在遍歷中心點的時候,要注意中心點有兩種情況。

一個元素可以作為中心點,兩個元素也可以作為中心點。

那么有人同學(xué)問了,三個元素還可以做中心點呢。其實三個元素就可以由一個元素左右添加元素得到,四個元素則可以由兩個元素左右添加元素得到。

所以我們在計算的時候,要注意一個元素為中心點和兩個元素為中心點的情況。

class Solution { public:int countSubstrings(string s) {int result = 0;for (int i = 0; i < s.size(); i++) {result += extend(s, i, i, s.size()); // 以i為中心result += extend(s, i, i + 1, s.size()); // 以i和i+1為中心}return result;}int extend(const string& s, int i, int j, int n) {int res = 0;while (i >= 0 && j < n && s[i] == s[j]) {i--;j++;res++;}return res;} }; 時間復(fù)雜度:O(n^2) 空間復(fù)雜度:O(1)

總結(jié)

以上是生活随笔為你收集整理的回文子串个数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美日韩av在线 | 影音先锋资源av | 青青草欧美| 国产不卡在线观看视频 | 一区二区三区视频在线观看 | 涩涩视频网 | 日本一区二区三区在线观看视频 | 久久国产视频播放 | 91精品国产麻豆国产自产在线 | 欧美夜夜| 久久免费少妇高潮久久精品99 | 手机av在线| 成人毛片18女人毛片免费 | 张津瑜国内精品www在线 | 国产精品a久久久久 | 大奶子在线观看 | 久久免费高清 | 免费在线成人网 | 亚洲激情免费 | 河北彩花av在线播放 | 激情文学综合网 | 日日爽夜夜| 一道本av在线 | 精品一区二区在线视频 | 福利一区二区视频 | 高清欧美性猛交xxxx黑人猛交 | 久久免费高清 | 重口味av | 日韩视频在线观看免费 | 美女国产网站 | 国产123区| 日日夜夜免费 | 九九热在线精品视频 | 国产91在线亚洲 | 国产又爽又黄免费视频 | 色人人 | av爽妇网| 欧美一区欧美二区 | 成人精品免费视频 | 欧美在线一区二区三区 | 级毛片 | 丁香婷婷深情五月亚洲 | 日韩高清影院 | 亚洲国内自拍 | 各种含道具高h调教1v1男男 | va在线 | 岳睡了我中文字幕日本 | 亚洲欧美在线免费 | 久艹在线播放 | 免费观看黄色av | 亚洲成人日韩在线 | 二区中文字幕 | 精品动漫一区二区三区在线观看 | 一区二区天堂 | 亚洲美女爱爱 | 久久亚洲国产成人精品性色 | 特黄一区二区 | 天天射天天操天天干 | 久久综合一区二区三区 | 69福利网| 久久精品国产亚洲7777 | av观看免费 | 国产精品久久777777毛茸茸 | 97国产资源 | 国产精品国产精品国产专区不卡 | 一区自拍 | 中文字幕第22页 | 一区二区三区四区久久 | 欧美一区二区大片 | 亚洲乱亚洲 | 在线观看的av网站 | 中文字幕一区二区人妻痴汉电车 | 久久毛片视频 | 亚洲xx网 | 欧美人喂奶吃大乳 | 亚洲国产aⅴ精品一区二区 日韩黄色在线视频 | 91亚洲一区二区 | 色很久| 综合久久久久久久久久久 | 嫩草av久久伊人妇女超级a | 欧美黑人xxx | 亚洲精品久久久久久国产精华液 | 福利在线一区二区 | 国产经典一区二区三区 | 一区二区三区欧美在线 | 国产一区二区精品在线 | 97狠狠操 | 极品超粉嫩尤物69xx | 久久精品视频18 | 男女免费毛片 | 不卡精品| 91亚洲精品一区 | 四虎8848精品成人免费网站 | 欧美色鬼| 天天综合中文字幕 | sm一区二区三区 | 中文字幕――色哟哟 | 美女扒开尿口给男人桶 | 日韩成人福利视频 |