1040 Longest Symmetric String (25分)/最长回文子串

题目描述

在这里插入图片描述

思路

暴力法时间复杂度为O(n3),会超时。网上关于这个问题有很多算法,比如动态规划DP,中心扩展算法。由于中心扩展算法较好理解,时间复杂度为O(n2),基本可以解决类似OJ题。

中心扩展算法

即以字符串某个位置为中心向两边扩展,直到不能构成回文串。
注意:区分奇数串与偶数串。

AC代码

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
	string s;
	getline(cin, s);
	int m = 1;
	for (int i = 0; i < s.size(); i++) {
		int k1=1,k2=0,len;
		while(i - k1 >= 0 && i + k1 < s.size()&& s[i - k1] == s[i + k1]){
			k1++;
		}
		int j = i + 1;
		while (i - k2 >= 0 && j + k2 < s.size() && s[i - k2] == s[j + k2]) {
			k2++;
		}
		len = max((k1-1) * 2 + 1,k2*2);
		if (len > m) m = len;
	}
	cout << m;
	return 0;
}

其他类似问题

leetcode或其他OJ上也有类似问题,如将此最长回文子串作为返回值:

string longestPalindrome(string s) {
	int m = 1, pos = 0;
	for (int i = 0; i < s.size(); i++) {
		int k1, k2, len, tempos;
		for (k1 = 1; i - k1 >= 0 && i + k1 < s.size() && s[i - k1] == s[i + k1]; k1++);
		for (k2 = 0; i - k2 >= 0 && i + 1 + k2 < s.size() && s[i - k2] == s[i + 1 + k2]; k2++);
		if (2 * k1 - 1 > 2 * k2) {
			len = 2 * k1 - 1;
			tempos = i - k1 + 1;
		}
		else {
			len = 2 * k2;
			tempos = i - k2 + 1;
		}
		if (len > m) {
			m = len;
			pos = tempos;
		}
	}
	return s.substr(pos, m);
}
发布了62 篇原创文章 · 获赞 7 · 访问量 3116

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104183764