求字符串中最长回文字符串

刷第二遍leetcode了啦!本题的解法见证了自己对解回文子字符串题目的认知过程。有点感触,便记录了两种解法。第一种是有多幼稚哈,但也是学习过程中的一部分。对自己喊加油,再刷100道题。

题目:Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

举例如下:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Input: "cbbd"
Output: "bb"
解法一(现在看,真是不忍直视哈)
string longestPalindrome(string s) {
	int k = s.size();
	if (k == 0 || k == 1)
		return s;
	while (k != 1) {
		for (int i = 0; i + k <= s.size(); ++i) {
			int m = i, n = k - 1 + i;
			while (s[m++] == s[n--]) {
				if (m >= n) {
					return s.substr(i, k);
				}
			}
		}
		--k;
	}
	return s.substr(0, 1);
}
解法二(第二次上手时写的,稍稍修改还可以提升运行速度,因为有一些是不需要再遍历的)
string longestPalindrome(string s) {
	int sLen = s.size();
	int maxRes = 0;
	int left, right;
	int pos;//用来记录最终子字符串起始位置
	for (int i = 0; i < sLen; ++i) {
		left = right = i;
		while (right < sLen && s[left] == s[right + 1]) ++right;//计算起始时重复的字符
		i = right;//重复的字符,在下次for循环时就直接跳过
		while (left > 0 && right < sLen - 1 && (s[left - 1] == s[right + 1])) {
			--left;
			++right;
		}

		//maxRes = max(maxRes, right - left + 1);
		if (maxRes < right - left + 1) {
			pos = left;
			maxRes = right - left + 1;
		}
	}
	return s.substr(pos, maxRes);
}

猜你喜欢

转载自blog.csdn.net/tt_love9527/article/details/80937733
今日推荐