牛客網 psd面試 最長公共子串行 回文串

2022-09-17 14:03:13 字數 2738 閱讀 2570

掌握未來命運的女神 psd 師兄在拿了朝田詩乃的 buff 後決定去實習。

埃森哲公司註冊成立於愛爾蘭,是一家全球領先的專業服務公司,為客戶提供戰略、諮詢、數字、技術和運營服務及解決方案。他們立足商業與技術的前沿,業務涵蓋40多個行業,以及企業日常運營部門的各個職能。憑藉獨特的業內經驗與專業技能,以及翹楚全球的交付網路,他們幫助客戶提公升績效,並為利益相關方持續創造價值。埃森哲是《財富》全球500強企業之一,目前擁有約41.1萬名員工,服務於120多個國家的客戶。於是psd打算去埃森哲公司投一下簡歷。

於是他用英文寫了一篇簡歷,由於手速太快了以致自己都不知道寫了什麼。

然而面試官 xwc 一眼就看到了重點:大學打過 acm!

xwc:「

聽說你很低襖?考你個題:

忽略字母大小寫,你這篇簡歷去掉最長的回文子串行後還有多長?

」 psd 順手就把這個問題拋給了你。

輸入描述:

多組輸入,每組輸入乙個長度不超過 1234 的沒空格的字串,是 psd 的簡歷。

輸出描述:

每組輸出乙個整數,如題。

示例1

輸入 google

輸出 2

示例2

輸入 abc,bad

輸出 2

所謂求最長回文子串行就是求原串和原串倒過來的lcs,注意題目中要求除去最長回文子串行剩下的長度。

那麼如何求lcs呢。

dp操作,dp陣列中的i和j分別表示在兩串中,分別取到前i位和前j位時,兩個字首子串所遞推得到的最長公共子串行。

因此我們將陣列中的0位【i,0】和【0,i】分別初始化為0,表示無論i是多少,另乙個串字首取幾位,與當前串的空串都不會有任何公共子串行。

接著我們開始遞推,遍歷i,j以對比兩串中相等的字元,一旦遇到相等的字元,我們將從i-1,j-1的位置繼承狀態,並延續繼承到的最長公共子串行的記錄值,也就是+1操作,表示,當兩串的第i位字元和第j位字元相等時,將從不包括這兩個字元的字首子串裡得到的最長公共子串行+1,得到當前位置的新的最長公共子串行。也就是求解當前i,j的狀態,來自於i-1,j-1的狀態+1獲得。

而當i,j位置的字元不等時,當前位不能延續最長公共子串行的值,只能從之前求得的值中繼承。那麼我們要求最長的公共子串行,就是要繼承所有狀態中最大的值,也就是三個位置中選最大值,即i-1,j 和i,j-1和i-1,j-1三個方向取最大值繼承。這樣遞推,每次都使用最大值,繼承最大值,延續最大值,將得到的結果也是第lenx,leny處,整個串的最長公共子串行。

於是我們得到狀態轉移方程:

可以看到,就像之前說的,只有字元相等時,才會有+1的延續,而且只從i-1和j-1處繼承,可能你會問,為什麼不取3個方向的最大值繼承並延續,是因為我們當前匹配成功的是第i和j個字元,那麼前i位字首中已經和前j位字首得到了乙個最大值,前面提到,我們從i-1,j-1位繼承,是因為我們第i位與第j位相等了,我們此處一定能算上乙個公共的子串行,那麼如果除去這個新獲得的公共字元,那麼就是i-1,j-1的字串進行比較,只能從沒有去i和j的字首中取乙個狀態。

如果我們取了i-1,j表示j字元我們已經取到過了,在這個狀態中即乙個串的前j位和另乙個串的前i-1位的最長公共子串行值,那就不存在我們取j位和i位相等的情況了,因為j早就被其他字元所匹配過了。同理i,j-1也是如此,既然這個狀態中i已經被配過,新來 j和誰配?明明和i相等,但是i被別的字元給配走了,無法形成乙個新的公共字元以增長最長公共子串行值。

總結一下,即增長最長公共子串行只能從i-1,j-1這個狀態繼承並延續,因為要改變這個狀態,需要的是不影響當前匹配狀態的上乙個狀態。 而當不匹配當前字元時,我們選擇延續值最大的那個匹配狀態,也就是進行i-1,j-1 和i-1,j和j,j-1三選一的操作,因為當前已經不匹配了,我要繼續讀取新字元檢查是否匹配,對於廢掉的當前位,我們不需要對上乙個狀態有什麼特殊的要求,因此直接取最大的保留下來即可,為將來可能出現的公共字元提供乙個最優解來延續。

就這樣遞推到字元末尾即可得到兩個完整串的最長公共子串行。

#include///最長公共子串行

#include

#include

using

namespace

std;

int vis[2008][2009],t;

int main()

for(int i=1; i<=ly; i++)

vis[0][0]=0;///空串比較空串

for(int i=1; i<=lx; i++)///dp陣列中i和j表示,當乙個串長i,另乙個串長j時,在此情況下的最長公共子串行

else

vis[i][j]=vis[i-1][j-1]+1;}}

// printf(" ");///這是乙個很美的動態規劃形成的遞推**,想要了解過程的可以解開注釋看一下過程

// for (int i=1; i<=lx; ++i)

// printf(" %c",x[i]);

// puts("");

// for(int i=0; i<=ly; i++)

//

printf("%d\n",ly-vis[lx][ly]);

}return

0;}

牛客網 最長公共子串行

我們有兩個字串m和n,如果它們的子串a和b內容相同,則稱a和b是m和n的公共子串行。子串中的字元不一定在原字串中連續。例如字串 abcfbc 和 abfcab 其中 abc 同時出現在兩個字串中,因此 abc 是它們的公共子串行。此外,ab af 等都是它們的字串。現在給你兩個任意字串 不包含空格 ...

牛客網 高頻面試題 最長公共子串

最長公共子串 牛客題霸 牛客網 題目描述 給定兩個字串str1和str2,輸出兩個字串的最長公共子串 題目保證str1和str2的最長公共子串存在且唯一。示例1輸入 1ab2345cd 12345ef 返回值 2345 動態規劃 dp i j i代表str1 i 結尾的串,j代表str2 j 結尾的...

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...