730. Count Different Palindromic Subsequences

Description

Given a string S, find the number of different non-empty palindromic subsequences in S, and return that number modulo 10^9 + 7.

A subsequence of a string S is obtained by deleting 0 or more characters from S.

A sequence is palindromic if it is equal to the sequence reversed.

Two sequences A_1, A_2, ... and B_1, B_2, ... are different if there is some i for which A_i != B_i.

Example 1:

Input:
S = 'bccb'
Output: 6
Explanation:
The 6 different non-empty palindromic subsequences are 'b', 'c', 'bb', 'cc', 'bcb', 'bccb'.
Note that 'bcb' is counted only once, even though it occurs twice.

Example 2:

Input:
S = 'abcdabcdabcdabcdabcdabcdabcdabcddcbadcbadcbadcbadcbadcbadcbadcba'
Output: 104860361
Explanation:
There are 3104860382 different non-empty palindromic subsequences, which is 104860361 modulo 10^9 + 7.

Note:

  • The length of S will be in the range [1, 1000].
  • Each character S[i] will be in the set {'a', 'b', 'c', 'd'}.

Solution

DP (using 3D array), time

大開眼界的一道題峻村,原來用3D DP好多事情都會迎刃而解惹悄。癣缅。

Let dp[x][i][j] be the answer for the substring S[i...j] where S[i] == S[j] == 'a'+x. Note that since we only have 4 characters a, b, c, d, thus 0 <= x < 4. The DP formula goes as follows:

  • If S[i] != 'a'+x, then dp[x][i][j] = dp[x][i+1][j], note that here we leave the first character S[i] in the window out due to our definition of dp[x][i][j].
  • If S[j] != 'a'+x, then dp[x][i][j] = dp[x][i][j-1], leaving the last character S[j] out.
  • If S[i] == S[j] == 'a'+x, then dp[x][i][j] = 2 + dp[0][i+1][j-1] + dp[1][i+1][j-1] + dp[2][i+1][j-1] + dp[3][i+1][j-1]. When the first and last characters are the same, we need to count all the distinct palindromes (for each of a,b,c,d) within the sub-window S[i+1][j-1] plus the 2 palindromes contributed by the first and last characters. 注意這里為什么是加2鹃答?讓我們回歸到dp[x][i][j]的定義上莉撇,其包含的palindrome的最左和最右字符一定是x鳖眼,所以推導(dǎo)dp[x][i][j]的時(shí)候必須將x放在其頭尾,那么就有"x + subPalindromes + x", "xx", "x"這幾種情況祭衩,加2就顯而易見了灶体。

Let n be the length of the input string S, The final answer would be dp[0][0][n-1] + dp[1][0][n-1] + dp[2][0][n-1] + dp[3][0][n-1] mod 1000000007.

考慮一下這種思路為什么2D DP是不夠用的。假設(shè)dp[i][j]表示s[i...j]的palindrome sequence count掐暮,那么如果s[i] != s[j]蝎抽,dp[i][j] = dp[i + 1][j] + dp[i][j - 1]是錯的,因?yàn)樽訂栴}會有重復(fù)解路克。只有再添加一維x樟结,指定字符,每個子問題才是獨(dú)立的精算。

好吧還是有點(diǎn)懵瓢宦。。

class Solution {
    public int countPalindromicSubsequences(String s) {
        int n = s.length();
        int mod = 1000000007;
        int[][][] dp = new int[4][n][n];
        
        for (int i = n - 1; i >= 0; --i) {
            for (int j = i; j < n; ++j) {
                for (int k = 0; k < 4; ++k) {
                    char c = (char) ('a' + k);
                    
                    if (j == i) {
                        if (s.charAt(i) == c) {
                            dp[k][i][j] = 1;
                        }
                        continue;
                    }
                    
                    if (s.charAt(i) != c) {
                        dp[k][i][j] = dp[k][i + 1][j];
                    } else if (s.charAt(j) != c) {
                        dp[k][i][j] = dp[k][i][j - 1];
                    } else {
                        dp[k][i][j] = 2;
                        for (int x = 0; x < 4; ++x) {
                            dp[k][i][j] += dp[x][i + 1][j - 1];
                            dp[k][i][j] %= mod;
                        }
                    }
                }
            }
        }
        
        int res = 0;
        for (int k = 0; k < 4; ++k) {
            res += dp[k][0][n - 1];
            res %= mod;
        }
        
        return res;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灰羽,一起剝皮案震驚了整個濱河市驮履,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌廉嚼,老刑警劉巖玫镐,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異前鹅,居然都是意外死亡摘悴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門舰绘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹂喻,“玉大人,你說我怎么就攤上這事捂寿】谒模” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵秦陋,是天一觀的道長蔓彩。 經(jīng)常有香客問我,道長驳概,這世上最難降的妖魔是什么赤嚼? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮顺又,結(jié)果婚禮上更卒,老公的妹妹穿的比我還像新娘。我一直安慰自己稚照,他們只是感情好蹂空,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布俯萌。 她就那樣靜靜地躺著,像睡著了一般上枕。 火紅的嫁衣襯著肌膚如雪咐熙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天辨萍,我揣著相機(jī)與錄音棋恼,去河邊找鬼。 笑死分瘦,一個胖子當(dāng)著我的面吹牛蘸泻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘲玫,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悦施,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了去团?” 一聲冷哼從身側(cè)響起抡诞,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎土陪,沒想到半個月后昼汗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鬼雀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年顷窒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片源哩。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鞋吉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出励烦,到底是詐尸還是另有隱情谓着,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布坛掠,位于F島的核電站赊锚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屉栓。R本人自食惡果不足惜舷蒲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望友多。 院中可真熱鬧牲平,春花似錦、人聲如沸夷陋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骗绕。三九已至藐窄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酬土,已是汗流浹背荆忍。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撤缴,地道東北人刹枉。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像屈呕,于是被迫代替她去往敵國和親微宝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,331評論 0 10
  • 一虎眨、白百何出軌被曝光 昨天“中國第一狗仔卓偉”曝光了白百何出軌的視頻及照片蟋软,這是繼卓偉曝光文章姚笛、林丹出軌后的又...
    前行女子閱讀 31,987評論 6 2
  • 雨泣云愁嗽桩, 愁散秋霽后岳守, 群星璀璨, 寒月當(dāng)空碌冶。 銀光照丹桂湿痢, 桂魂裊裊滿庭中, 香氣正濃扑庞。 嫦娥撫井桐譬重, 可憐梧...
    欣榮Y閱讀 335評論 2 29
  • #本文參加‘青春’大賽,本人保證本文為本人原創(chuàng)嫩挤,如有問題則與主辦方無關(guān)害幅,自愿放棄評優(yōu)評獎資格 作者: 藺甜 學(xué)校:...
    一患十年閱讀 251評論 0 2
  • 每天背著電腦,總是期待著能打開電腦敲敲鍵盤打打字岂昭,已經(jīng)喜歡上看著窄邊框的屏幕以现,輕薄的機(jī)身,果然無論是對于手機(jī)约啊、電腦...
    風(fēng)夕回落閱讀 223評論 0 0