代码随想录|动态规划(终章)跪求个offer

这里要注意的是我们的遍历顺序,不能是i一遍,j一遍这样,因为会包含后面的信息

所以我们这里选择的是先遍历长度,然后再遍历首字符

classSolution:defcountSubstrings(self,s:str)->int:n=len(s)dp=[[Falsefor_inrange(n+1)]for_inrange(n+1)]ans=nforiinrange(n+1):dp[i][i]=Trueforlinrange(2,n+1):foriinrange(n-l+1):ifs[i]==s[i+l-1]:ifi+1<=i+l-2:ifdp[i+1][i+l-2]:dp[i][i+l-1]=Trueans+=1else:dp[i][i+l-1]=Trueans+=1returnans参考答案非常机智!!!

首先看这幅图,在我们需要知道dp[i][j]是否为回文子串的前提是知道dp[i+1][j-1]

所以!!!

i是从大到小进行遍历,j是从小到大进行遍历。所以!!非常有意思。

并且在进行判断的时候,使用i-j<=1然后进行dp[i][i+l-1]=True,这样的话可读性更强

classSolution:defcountSubstrings(self,s:str)->int:dp=[[False]*len(s)for_inrange(len(s))]result=0foriinrange(len(s)-1,-1,-1):#注意遍历顺序forjinrange(i,len(s)):ifs[i]==s[j]and(j-i<=1ordp[i+1][j-1]):result+=1dp[i][j]=Truereturnresult双指针法动态规划的空间复杂度是偏高的,我们再看一下双指针法。

首先确定回文串,就是找中心然后向两边扩散看是不是对称的就可以了。

在遍历中心点的时候,要注意中心点有两种情况。

一个元素可以作为中心点,两个元素也可以作为中心点。

那么有人同学问了,三个元素还可以做中心点呢。其实三个元素就可以由一个元素左右添加元素得到,四个元素则可以由两个元素左右添加元素得到。

所以我们在计算的时候,要注意一个元素为中心点和两个元素为中心点的情况。

classSolution:defcountSubstrings(self,s:str)->int:result=0foriinrange(len(s)):result+=self.extend(s,i,i,len(s))#以i为中心result+=self.extend(s,i,i+1,len(s))#以i和i+1为中心returnresultdefextend(self,s,i,j,n):res=0whilei>=0andj

ifs[i]==s[j]:dp[i][j]=dp[i+1][j-1]+2

ifs[i]!=s[j]:dp[i][j]=max(dp[i+1][j],dp[i][j-1])

一个从正面,一个反面

j>i

classSolution:deflongestPalindromeSubseq(self,s:str)->int:dp=[[0]*len(s)for_inrange(len(s))]foriinrange(len(s)):dp[i][i]=1foriinrange(len(s)-1,-1,-1):forjinrange(i+1,len(s)):ifs[i]==s[j]:dp[i][j]=dp[i+1][j-1]+2else:dp[i][j]=max(dp[i+1][j],dp[i][j-1])returndp[0][-1]

动规五部曲分别为:

动规专题刚开始的时候,讲的题目比较简单,不少录友和我反应:这么简单的题目讲的复杂了,不用那么多步骤分析,想出递推公式直接就AC这道题目了。

THE END
1.代码随想录训练营感受以及收获代码随想录怎么样很庆幸参加了代码随想录训练营,虽然代码随想录训练营的所有资料都是公开的,也可以自己去学习。但是参加代码随想录训练营最大的好处就是提供了一个良好的刷题氛围,同时由于制定好了每天的刷题任务,使得刷题过程中更有目标感,起到了一个督促作用。这两个月来,有很多次因为事情太多以及状态不好等原因想对刷算法题有https://blog.csdn.net/weixin_43881491/article/details/139472052
2.代码随想录训练营代码随想录第九天 | KMP 代码随想录今天虽然只有一题,但KMP算法还是挺难理解的。在看了视频以后仍然有一些疑惑,在getNext中,似乎i需要多次回到起始位置,还需要带到不同的数组中思考一下。目前KMP的算法我是记下来了,但具体原理还需要多多复习和实验。… https://www.zhihu.com/column/c_1555850363701231618
3.代码随想录算法训练营第十三天●239.滑动窗口最大值●347.前你的算法必须比时间更复杂 $O(n \log n)$ , n 是数组的大小。 题目数据保证答案是唯一的,换句话说,在数组中 k 高频元素的集合是唯一的。 您可以按任何顺序返回答案。 思路: 用map记录每个元素的出现频率,然后用优先级队列对出现频率进行排序。暂放。 https://www.tulingxueyuan.cn/tlzx/jsp/3325.html
4.代码随想录训练营任务汇总代码随想录算法训练营35期 ● day 1 任务以及具体安排:第一章 数组part01(4.3) ● day 2 任务以及具体安排:第一章 数组part02(4.4) ● day 3 任务以及具体安排:第二章 链表part01(4.5) ● day 4 任务以及具体安排:第二章 链表part02(4.6) https://www.jianshu.com/p/e718471e1dbd
5.代码随想录个人动态代码随想录动态记录代码随想录算法训练营! 在代码随想录算法训练营一期结束报名之后,训练营开启常态化报名。 大家在文末的【支付方式】介绍中,可以看到 目前正在开启报名的训练营。 大家可以百度搜索:代码随想录算法训练营,感受一下往期录友们打卡记录的博客。 [图片] 这是训练营里录友坚持到最后一天的打卡,总结: 博客链接:https:/https://space.bilibili.com/525438321/dynamic
6.书单豆瓣高分&全网热评的算法神作▊《代码随想录——跟着Carl学算法》 孙秀洋 著 本书荣获2021年度CSDN评选的IT技术影响力之星“十大IT图书”奖项 本书是用C++进行讲解的,支持本书内容的 Java、Python、Go、JS、PHP、C、Swift等语言版本。可以查看本书内容和讲解思路,配合网站一起学习。 http://www.broadview.com.cn/article/420385
7.卡码笔记《代码随想录》贪心算法:单调递增的数字 难度:困难 考点:贪心算法 写笔记2 篇笔记kamaCoder57382 5 天前 算法训练营Day31 | 738.单调递增的数字 从后向前遍历数字,遇到strNum[i-1] > strNum[i]的情况,将strNum[i-1]-1,然后strNum[i]改为9,i--,这样可以重复利用上次比较得出的结果。完整代码:展https://notes.kamacoder.com/question/102058