程式設計題 字串運用 密碼擷取

2021-07-25 11:08:01 字數 2002 閱讀 2768

talk is cheap, show me the code.

catcher是mca國的情報員,他工作時發現敵國會用一些對稱的密碼進行通訊,比如像這些abba,aba,a,123321,但是他們有時會在開始或結束時加入一些無關的字元以防止別國破解。比如進行下列變化 abba->12abba,aba->abakk,123321->51233214 。因為截獲的串太長了,而且存在多種可能的情況(abaaab可看作是aba,或baaab的加密形式),cathcer的工作量實在是太大了,他只能向電腦高手求助,你能幫catcher找出最長的有效密碼串嗎?

輸入描述:

輸入乙個字串

輸出描述:

返回有效密碼串的最大長度

輸入例子:

abba

輸出例子:

這是最長字串回文問題,有多種思路。思路一,採用典型的最佳字串回文問題解法manacher,複雜度是o(n)。思路二,類似於manacher,不過不用去考慮每個字元的初始回文半徑,直接都設定為1,這樣複雜度是o(n*n)。思路三,從字串長度考慮起,逐個減少字串長度直至為1,因為1個字元是最短的回文,時間複雜度是o(n * n * n)。

解題方式1:

採用manacher演算法。manacher的原理詳見

#include #include #include #include using namespace std;

int main()

vectorvect;

int maxcenter = 0, maxright = 0;

int temp = 0;

for (int i = 0; i < s.size(); i++)

else

while (i - temp >= 0 && i + temp < s.size() && s[i - temp] == s[i + temp])

vect.push_back(temp);

if ( temp > (maxright - maxcenter))

}cout << (maxright - maxcenter - 1) << endl;

}return 0;

}

時間複雜度為o(n)。

解題方式2:

採用類似manacher的方式,但是直接將每個字元為中心時的回文半徑設定為1。

#include #include using namespace std;

int main()

int maxradius = 1, temp = 1;

for (int i = 0; i < str.size(); i++)

if (temp > maxradius)

}cout << maxradius - 1 << endl;

}return 0;

}

時間複雜度為o(n * n)。

解題方式3:

從字串長度逐個減一,一直到找到最長回文長度。

#include #include #include using namespace std;

bool issymmetric(string s)

}return true;

}int main()

}if (maxlen != 0)

break;

}cout << maxlen << endl;

}return 0;

}

時間複雜度為o(n * n * n)。

華為OJ基礎題 字串運用 密碼擷取

catcher是mca國的情報員,他工作時發現敵國會用一些對稱的密碼進行通訊,比如像這些abba,aba,a,123321,但是他們有時會在開始或結束時加入一些無關的字元以防止別國破解。比如進行下列變化 abba 12abba,aba abakk,123321 51233214 因為截獲的串太長了,...

字串運用 密碼擷取

catcher 是mca國的情報員,他工作時發現敵國會用一些對稱的密碼進行通訊,比如像這些abba,aba,a,123321,但是他們有時會在開始或結束時加入一些無關的字元以防止別國破解。比如進行下列變化 abba 12abba,aba abakk,123321 51233214 因為截獲的串太長了...

華為機試 字串運用 密碼擷取

題目描述 catcher 是mca國的情報員,他工作時發現敵國會用一些對稱的密碼進行通訊,比如像這些abba,aba,a,123321,但是他們有時會在開始或結束時加入一些無關的字元以防止別國破解。比如進行下列變化 abba 12abba,aba abakk,123321 51233214 因為截獲...