掌握未來命運的女神 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...