字符串dp系列

devtools/2025/1/18 3:31:42/

647. 回文子串

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。

示例 1:

输入: "abc"
输出: 3
解释: 三个回文子串: "a", "b", "c".
示例 2:

输入: "aaa"
输出: 6
说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".

1.暴力,生成所有子串,一个个判断

2.dp[j][i]表示从j到i是否为回文串,如果s[j]==s[i],且dp[j+1][i-1]也是回文串,那么dp[j][i]为真

其实dp也可以用来表示状态,并不一定就是最后的结果!

class Solution:def countSubstrings(self, s: str) -> int:res=[]for i in range(len(s)):for j in range(i,len(s)):res.append(s[i:j+1])def func(s):for i in range(len(s)//2):if s[i]!=s[len(s)-1-i]:return Falsereturn Trueans=0for r in res:if func(r):ans+=1return ansclass Solution:def countSubstrings(self, s: str) -> int:n=len(s)res=0dp=[[False for _ in range(n)] for _ in range(n)]for j in range(n):for i in range(j+1):if ( j-i+1<=2 or dp[i+1][j-1] ) and s[i]==s[j]:dp[i][j]=True  res+=1return res

5. 最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
1.输出: "bb"

1.dp[j][i]表示从j到i是否为回文串,如果s[j]==s[i],且dp[j+1][i-1]也是回文串,那么dp[j][i]为真

2.中心扩展

class Solution:def longestPalindrome(self, s: str) -> str:'''dp[i][j]=true if dp[i+1][j-1] and s[i]==s[j]'''res=""n=len(s)dp=[ [False for _ in range(n)] for _ in range(n)]for i in range(n):dp[i][i]=Truefor j in range(n):for i in range(j):if (j-i+1<=2 or dp[i+1][j-1] ) and s[i]==s[j]:dp[i][j]=Trueif j-i+1>len(res):res=s[i:j+1] return res if res else s[0]class Solution:def longestPalindrome(self, s: str) -> str:n=len(s)self.res=""def helper(i,j):while i>=0 and j<n and s[i]==s[j]:i-=1j+=1if len(self.res)<j-i-1:self.res=s[i+1:j]for i in range(n):helper(i,i)helper(i,i+1)return self.res

回文串通用dp思路,dp[i][j]表示区间【i,j】是否是回文串,dp[i][j]=True  if d[i+1][j-1]=True and s[i]==s[j],注意子串和子序列的区别。

300. 最长上升子序列

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

说明:

    可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
    你算法的时间复杂度应该为 O(n2) 。

进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

class Solution:def lengthOfLIS(self, nums: List[int]) -> int:'''dp[i]=max(dp[j])+1   i>j and nums[i]>nums[j]'''if not nums:return 0n=len(nums)dp=[1 for _ in range(n)]for i in range(1,n):for j in range(i):if nums[i]>nums[j]:dp[i]=max(dp[i],dp[j]+1)return max(dp)

1143. 最长公共子序列

给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。

若这两个字符串没有公共子序列,则返回 0。

示例 1:

输入:text1 = "abcde", text2 = "ace"
输出:3  
解释:最长公共子序列是 "ace",它的长度为 3。

示例 2:

输入:text1 = "abc", text2 = "abc"
输出:3
解释:最长公共子序列是 "abc",它的长度为 3。

示例 3:

输入:text1 = "abc", text2 = "def"
输出:0
解释:两个字符串没有公共子序列,返回 0。

class Solution(object):def longestCommonSubsequence(self, text1, text2):M, N = len(text1), len(text2)dp = [[0] * (N + 1) for _ in range(M + 1)]for i in range(1, M + 1):for j in range(1, N + 1):if text1[i - 1] == text2[j - 1]:dp[i][j] = dp[i - 1][j - 1] + 1else:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])return dp[M][N]

最长公共子串

def LCstring(string1,string2):len1 = len(string1)len2 = len(string2)res = [[0 for i in range(len1+1)] for j in range(len2+1)]result = 0for i in range(1,len2+1):for j in range(1,len1+1):if string2[i-1] == string1[j-1]:res[i][j] = res[i-1][j-1]+1result = max(result,res[i][j])  return result


http://www.ppmy.cn/devtools/151449.html

相关文章

闲谭SpringBoot--ShardingSphere分布式事务探究

文章目录 0. 背景1. 未分库分表时2. 仅分表时3. 分库分表时3.1 不涉及分库表3.2 涉及分库表&#xff0c;且分库表处于一个库3.3 涉及分库表&#xff0c;且分库表处于多个库3.4 涉及分库表&#xff0c;且运行中某库停机 4. 小结 0. 背景 接上篇文章《闲谭SpringBoot–ShardingS…

计算机网络(四)——网络层

目录 一、功能 二、IP数据报分片 三、DHCP动态主机配置协议 四、网络地址转换&#xff08;NAT&#xff09;技术 五、无分类编址CIDR 六、ARP地址解析协议 七、ICMP网际控制报文协议 八、IPv4和IPv6的区别 九、IPv4向IPv6的两种过渡技术——双栈协议和隧道技术 十、路由…

深入Node.js集群:原理、优势与搭建实战,如何应对高并发

文章目录 一、Node.js 集群简介二、Node.js 集群原理剖析2.1 主从模型2.2 负载均衡机制2.3 进程间通信&#xff08;IPC&#xff09; 三、Node.js 集群优势详解3.1 性能提升3.2 高可用性3.3 资源利用率优化 四、Node.js 集群搭建实战4.1 准备工作4.2 创建主控制节点4.3 工作节点…

文件操作的训练(python)

一、在文件夹中新建多个文件并写入内容 #写入函数 def file_write(file_name):#打开文件fileopen(file_name,"w")#写入内容file.write("Hello world")#关闭文件file.close() import os #新建一个文件夹"images" os.mkdir("images") #…

Golang|单机并发缓存

var m sync.Mutex //sync.Mutex 是一个互斥锁&#xff0c;可以由不同的协程加锁和解锁。 //sync.Mutex 是 Go 语言标准库提供的一个互斥锁 //当一个协程(goroutine)获得了这个锁的拥有权后&#xff0c;其它请求锁的协程(goroutine)就会阻塞在 Lock() 方法的调用上&#xff0c;直…

Spring Boot中使用AOP实现权限管理

权限管理的实现方法有很多种&#xff0c;也有很多集成不错的框架。现在用AOP和自定义注解实现一个简单易理解的权限管理~ 默认已经有做好了RBAC(role based access control)&#xff0c;基于角色的访问控制。就是数据库中已经有了用户表&#xff0c;角色表&#xff0c;权限表…

MiniCPM-o 2.6:开源大型语言模型在多模态任务上超越GPT-4o和Claude 3.5

MiniCPM-o 2.6是一款开源的大型语言模型&#xff08;LLM&#xff09;&#xff0c;其在多模态任务上的表现令人瞩目&#xff0c;成功超越了GPT-4o和Claude 3.5等业界知名模型。以下是对MiniCPM-o 2.6的详细介绍&#xff1a; 一、卓越的多模态能力 MiniCPM-o 2.6采用了先进的端…

ElasticSearch的劈山斧-自定义评分

ElasticSearch自定义评分 一、适用的场景 1.基本介绍 ES的使用中&#xff0c;ES会对我们匹配文档进行相关度评分。但对于一些定制化的场景&#xff0c;默认评分规则满足不了我们的要求。这些定制化场景&#xff0c;ES也是推出了自定义评分方式来进行支持。可以使用ES提供的一…