Longest Palindromic Substring

18 篇文章 0 订阅

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.


思路一:这题首先想到的是递归求解,代码很简单,但是当测试样例很长时,超时,所以直接pass.


思路二:动态规划

用一个flag二维数组记录字符串子串是否回文的情况,flag[i][j]=true表示从字符串的i到j是回文。所以用双重循环,第一重循环从尾部开始往前扫描,假设当前位置为i,第二重循环从i+1往后扫描,这样可以直接利用前面记录的回文情况,只需要判定当前s[i]和s[j]是否相等。如果相等,则需要看flag[i+1][j-1]是否为true(why?因为i和j中间的字符串是i+1到j-1啊!),然后再判断是否更新结果。


对了,写完代码提交还有个小插曲,对测试样例(“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”)时间超时,想了还一会儿优化的方法,最后解决方案竟然是把if (flag[i + 1][j - 1] || j - i <= 2)这个或语句换一下顺序(这是换过的),OMG,这也是我想起了大一上C++课老师说的c++里面逻辑运算都是偷懒的,或运算只要有一个成立后面的条件就不判断了,这告诉我们好好听课的重要性!!!没换之前,j-i<=2大部分时间是不成立的,因此两个条件就老是要一起判断了,哎~


注:对动态规划不大清楚的,可以看看之前写的一篇背包问题,里面讲了动态规划的基本思想,还是很好理解的。

http://blog.csdn.net/andrewseu/article/details/50268987



class Solution {
public:
	string longestPalindrome(string s) {
		if (s.size() == 0)
			return s;
		bool flag[1000][1000];
		int maxLen = 0;
		string res = s.substr(0,1);
		
		for (int i = 0; i < 1000; ++i){
			for (int j = 0; j < 1000; ++j){
				if (i == j)
					flag[i][j] = true;//单个字符为回文
				else
					flag[i][j] = false;
			}
		}

		for (int i = s.size() - 1; i >= 0; --i){
			for (int j = i+1; j < s.size(); ++j){
				if (s[i] == s[j]){
					if (flag[i + 1][j - 1] || j - i <= 2){
						flag[i][j] = true;
						if (j - i + 1>maxLen){
							maxLen = j - i + 1;
							res = s.substr(i,maxLen);
						}
					}
				}
				else
					flag[i][j] = false;
			}
		}
		return res;
	}
		
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值