LeetCode之Shortest Palindrome

/*爲了獲取最短的迴文串,需要找到字符串從頭開始的最長迴文子串,然後取剩下部分
的字符串的逆序加到字符串的前頭,即可獲得最短迴文子串。所以解決該問題的關鍵部分是
尋找以第一個字符開始的最長迴文子串,有以下幾種方法:
1.採用暴力查找,大數據下會超時。
2.借用KMP算法來尋找最長迴文子串,即本代碼中所用方法;
3.採用Manacher算法。*/
class Solution {
public:
	string shortestPalindrome(string s) {
		if(s.size() <= 1) return s;
		int idx = kmp_search(s);
		int i = idx, j = idx+1;
		while(i >= 0 && j < s.size() && s[i] == s[j]){
			--i;
			++j;
		}
		if(i >= 0){
			i = idx - 1;
			j = idx + 1;
			while(i >= 0 && j < s.size() && s[i] == s[j]){
				--i;
				++j;
			};
		}
		if(j >= s.size()) return s;
		string sub = s.substr(j, s.size()-j);
		reverse(sub.begin(), sub.end());
		return sub + s;
	}

	int kmp_search(const string &s){
		vector<int> next;
		get_next(s, next);
		int i = 0, j = s.size() - 1;
		while(i < j){
			if(i == -1 || s[i] == s[j]){
				++i;
				--j;
			}
			else i = next[i];
		}
		return j;
	}

	void get_next(const string &s, vector<int> &next){
		next.assign(s.size(), 0);
		int i = 0, j = -1;
		next[i] = j;
		while(i < s.size()-1){
			if(j == -1 || s[i] == s[j]){
				++i;
				++j;
				next[i] = s[i] == s[j] ? next[j] : j;
			}
			else j = next[j];
		}
	}
};

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