当前位置: 首页 > 后端技术 > Python

LeetCode - 0647. 回文子串【Medium】【Python】【中心扩展】【动态规划】

时间:2023-03-25 20:26:24 Python

力扣|0647.PalindromicSubstrings【中篇】【Python】【中心扩展】【动态编程】问题LeetCode给定一个字符串,你的任务是统计这个字符串中有多少个回文子串。起始索引或结束索引不同的子串算作不同的子串,即使它们由相同的字符组成。示例1:输入:“abc”输出:3解释:三个回文字符串:“a”、“b”、“c”。示例2:输入:“aaa”输出:6解释:六个回文字符串:"a","a","a","aa","aa","aaa"。注意:输入的字符串长度不会超过1000。题目给定一个字符串,你的任务是计算有多少个回文子串在这个字符串中。具有不同开始或结束位置的子串,即使它们由相同的字符组成,也被认为是不同的子串。示例1:输入:"abc"输出:3解释:三个回文子串:"a"、"b"、"c"示例2:输入:"aaa"输出:6解释:6个回文子串:"a"、"a","a","aa","aa","aaa"提示:输入字符串的长度不会超过1000。思路解决方案一:中心展开枚举每一个可能的回文中心,双指针分别向两边展开,如果指针指向同一个元素则继续扩展。因为要考虑回文的长度是奇数还是偶数,为了降低时间复杂度,我们选择用循环来解决。例子n=4:第i个回文中心左起始位置li回文中心右起始位置ri000101211312422523633经过分析,一个长度为n的字符串会生成2n-1组回文中心[li,ri],其中li=i/2,ri=li+(imod2).所有的回文中心都是通过简单地遍历0到2n-2找到的。时间复杂度:O(n^2)Python3codeclass解决方案:defcountSubstrings(self,s:str)->int:#解决方案一:中心展开n=len(s)ans=0foriinrange(2*n-1):left,right=int(i/2),int(i/2)+i%2whileleft>=0andrightint:#解决方法二:dynamic编程如果s是None或s=="":return0n=len(s)dp=[[Falsefor_inrange(n)]for_inrange(n)]res=len(s)fori在范围内(n):#basecasedp[i][i]=True#从左到右遍历右边的一个三角形区域foriinrange(n-1,-1,-1):forjinrange(i+1,n):ifs[i]==s[j]:#i和j相邻,即回文子串长度为2ifj-i==1:dp[i][j]=True#去掉左右两端,留下子串是回文子串else:dp[i][j]=dp[i+1][j-1]#不相等则不是回文子串else:dp[i][j]=Falseifdp[i][j]:res+=1returnresGitHublinkPython参考回文子串647.回文子串动态规划方法求解