LeetCode 5
2017年算法上机的终焉之战的某道题,sy老师课上提过最直观的解法,感谢助教亲切放水~
第一反应:求串的逆置,然后求原串和逆置串的最长相同子串,时间O(nlgn)
首先借此复习一下最长公共子序列和最长公共子串的解法:
最长公共子序列转移方程:
- dp[i][j]=dp[i-1][j-1]+1 (if a[i]==b[j]
dp[i][j]=max(dp[i-1][j],dp[i][j-1]) (if(a[i]!=b[j])
最长公共子串转移方程:
dp[i][j]=dp[i-1][j-1]+1 (if a[i]==b[j])
dp[i][j]=0(if(a[i]!=b[j])
在博客上找到了最长回文子串的动态规划转移方程,妙不可言
dp[i][j]= true if(j==i)
s[i]==s[j](if i-j=1)
s[i]==s[j]&&dp[j+1][i-1] (if i-j>1)
腊鸡网每次打到兴致勃勃想要马上提交看有没有AC的时候,leetcode就被墙掉了
好了总之dp方法代码如下:
class Solution {
public:
string longestPalindrome(string s) {
int length=s.size();
int dp[length][length];
int start=0;
int maxlen=0;
memset(dp,0,sizeof(dp));
for(int i=0;i<length;i++)
{
for(int j=0;j<=i;j++)
{
if(i==j)
{
if(s[i]==s[j])
{
dp[j][i]=1;
}
}
else if(i-j==1)
{
if(s[i]==s[j])
{
dp[j][i]=1;
}
}
else
{
if(s[i]==s[j]&&dp[j+1][i-1])
{
dp[j][i]=1;
}
}
if(dp[j][i]&&maxlen<i-j+1)
{
start=j;
maxlen=i-j+1;
}
}
}
string ans;
ans=s.substr(start,maxlen);
return ans;
}
};
从zqls的专栏知道了Manacher线性时间的方法
emmmm懵逼,暂且不多纠缠,没这么焦躁了再看
leetcode 6找规律 不赘述
leetcode 7反转数字 思路基础,但是!!!需要溢出判断!!!
class Solution {
public:
int reverse(int x) {
int ans=0;
int temp=0;
while(x!=0)
{
temp=x%10;
x=x/10;
if(ans>INT_MAX/10||ans<INT_MIN/10)//very important!!!
{
return 0;
}
ans=ans*10+temp;
}
return ans;
}
};
限制条件真的多到爆炸,怕不是考察条件判断的题吧