当前位置: 首页 > news >正文

7.15 窗口函数 | 二分 | 位运算 | 字符串dp

lc3316. 字符串dp

dp多开一行一列后,注意原字符串下标映射

 

dp[n][m] ( n 是source长度, m 是pattern长度)

两重循环填表

for i 1-n

   for j 0-m

 

三种状态转移

1.不选 dp i j=dp i-1 j

2.不选if tag, dp[i][j]++

3.if(s i==p j) 选,dp i j=max(dp i j, dp i-1 j-1)

从原字符串中挑选字符组成目标模式,同时尽可能多地删除指定位置的字符,最终能删多少个指定位置的字符。

 

具体逻辑拆解:

1. 前提设定:

- 有一个原字符串 source 和一个目标模式 pattern 

- 有一些指定位置 targetIndices ,删除这些位置的字符会被计分

 

2. 核心目标:

- 要从原字符串中选出字符,按顺序组成目标模式(字符顺序不能乱)

- 同时尽量多删 targetIndices 里的位置

- 最后返回最多能删掉多少个指定位置的字符

 

3. 具体做法(用表格记录状态):

- 用一个表格 f[i][j] 表示:处理到原字符串第 i 个字符,已匹配到模式第 j 个字符时,最多能删掉多少个指定位置

- 两种选择:

- 不选当前字符:直接跳过原字符串第 i 个字符,如果这个位置是指定位置,就加1分

- 选当前字符:如果当前字符和模式第 j 个字符相同,就用它来匹配,分数沿用之前的状态

 

4. 最终结果:

- 处理完所有字符后,表格中 f[n][m] 的值就是答案( n 是原字符串长度, m 是模式长度)

 

举个例子:

- 原字符串是"abcde",模式是"ace"

- 指定位置是[0,2](即第1个和第3个字符)

- 最优方案是选a、c、e组成模式,同时删掉位置0和2的字符,最终得2分

 

class Solution {

public:

    int maxRemovals(string source, string pattern, vector<int>& targetIndices) {

        int n = source.size(), m = pattern.size();

        vector<bool> flag(n + 1, false);  

        for (int x : targetIndices) 

            flag[x + 1] = true;  

        

        

        const int INF = 1e9;

        vector<vector<int>> f(n + 1, vector<int>(m + 1, -INF));

        f[0][0] = 0; // 初始状态:处理0个字符,匹配0个模式字符,删除数为0

        

        for (int i = 1; i <= n; i++) {

            for (int j = 0; j <= m; j++) {

                // 转移1:不使用source第i位,直接跳过

                f[i][j] = f[i - 1][j];

                if (flag[i]) { // 如果当前位置是指定删除位,删除数+1

                    f[i][j]++;

                }

                

                // 转移2:使用source第i位匹配pattern第j位(若字符相同)

                if (j > 0 && source[i - 1] == pattern[j - 1]) {

                    f[i][j] = max(f[i][j],f[i - 1][j - 1]);

                }

            }

        }

        

        return f[n][m]; // 处理完所有字符且匹配完整个模式时的最大删除数

    }

};

 

05.07

1.位运算

 

 

   2.位图

class Solution {
public:
int exchangeBits(int num) {
bitset<33> bitNum(num);
for (int i = 0; i < 16; i++){
bitNum[32] = bitNum[2*i];
bitNum[2*i] = bitNum[2*i+1];
bitNum[2*i+1] = bitNum[32];
}
return (int)bitNum.to_ulong();
}
};

 

577.员工奖金

select e.name,b.bonus

from Employee e 
left join Bonus b on e.empId = b.empId
where b.bonus <1000 or b.bonus is null;

 

游戏查询

select player_id,
min(event_date) as first_login
from Activity
group by player_id

 

lc1661

抽象后,计算查询

select
machine_id,
round(2*avg(if(activity_type = 'start',-1,1)*timestamp),3) as processing_time
from
Activity
group by
machine_id

 

lcr069.二分

 

class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int size = arr.size();
int left = 0;
int right = size - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(arr[mid] < arr[mid + 1]){
left = mid + 1;
}else{
right = mid - 1;
}
}
return left;
}
};

 

http://www.xdnf.cn/news/1122805.html

相关文章:

  • C# TCP粘包与拆包深度了解
  • MCP基础知识二(实战通信方式之Streamable HTTP)
  • 微信131~140
  • 属性绑定
  • 零基础 “入坑” Java--- 十一、多态
  • IDEA中使用Servlet,tomcat输出中文乱码
  • 《星盘接口2:NVMe风暴》
  • [spring6: Resource ResourceLoader ResourceEditor]-加载资源
  • 【Java笔记】七大排序
  • 现有医疗AI记忆、规划与工具使用的创新路径分析
  • 融合竞争学习与高斯扰动的多目标加权平均算法(MOWAA)求解多无人机协同路径规划(多起点多终点,起始点、无人机数、障碍物可自定义),提供完整MATLAB代码
  • 嵌入式硬件篇---晶体管的分类
  • Transformer江湖录 第五章:江湖争锋 - BERT vs GPT
  • ZYNQ双核通信终极指南:FreeRTOS移植+OpenAMP双核通信+固化实战
  • CSS面试题
  • C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果
  • 后端接口通用返回格式与异常处理实现
  • UI前端大数据处理新挑战:如何高效处理实时数据流?
  • JavaScript学习第九章-第三部分(内建对象)
  • 内测分发平台应用的异地容灾和负载均衡处理和实现思路
  • 8.服务通信:Feign深度优化 - 解密声明式调用与现代负载均衡内核
  • 【微信小程序】
  • SQL ORM映射框架深度剖析:从原理到实战优化
  • springboot 好处
  • 【日常技能】excel的vlookup 匹配#N/A
  • 如何将 iPhone 备份到云端:完整指南
  • Mysql数据库学习--多表查询
  • spring-ai-alibaba官方 Playground 示例之联网搜索代码解析
  • 力扣 hot100 Day44
  • 判断端口处于监听状态的方法