[算法相關]-最長迴文字符串

最長迴文字符串

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

(注意:記得加上while處理多個測試用例)

輸入描述:
輸入一個字符串

輸出描述:
返回有效密碼串的最大長度

思路分析:

  • 思路1:題目的含義最初理解錯了以爲迴文字符串只會出現在開始和結尾,結果測試用例沒過,實際上,這個題目還是要找字符串的最大回文字符串,而不管在什麼位置;暴力依次搜索即可;一個小技巧是,搜索可以從字符串最後往前搜索,這樣只要找到返回即可認爲是最大的,而不是從小依次搜索;
  • 思路2:通過思路1是能夠獲得答案的,但很明顯,運算複雜度較高(o(n^2)),無法滿足需要,而使用動態規劃,複雜度仍然是需要構建DP[N][N],複雜度仍然如此,這是少有的使用DP沒有優化效果的題目;有一種算法時間複雜度只需要 O(N),不過該解法比較複雜,個人認爲沒必要掌握。該算法的名字叫 Manacher’s Algorithm(馬拉車算法)
  • 思路1:代碼:
#include<iostream>
#include<string>
using namespace std;
bool judgehuiwen(const string& input){
	int str_len = strlen(input.c_str());
	if (input.empty()) return false;
	for (int i = 0; i <= str_len/2; i++)
	{
		if (input[i] != input[str_len -1- i]) {
			return false;
		}
	}
	return true;
}

int MatchingTarget(const string& input) {
	bool flag = false;
	int num = 0;
	if (input.empty()) {
		return 0;
	}
	int str_len = strlen(input.c_str());
	for (int i = 0; i < str_len; i++)
	{
		for (int j = i; j < str_len; j++)
		{
			if (input[j] == input[i]) {
				string tmp(input.begin()+i, input.begin() + j+1);
				if (judgehuiwen(tmp)) {
					int tmpstr_len = strlen(tmp.c_str());
					num = std::max(num, tmpstr_len);
				}
			}
		}

	}
	return num;
}

int test_maxValidPassword() {
	string input;
	while (cin >> input)
	{
		int num;
		num = MatchingTarget(input);
		printf("%d\n", num);
	}
	return 0;
}

參考鏈接:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章