【LeetCode第366场周赛】8028. 执行操作使两个字符串相等 | 线性DP | 中等

题目内容

原题链接

给定两个长度均为 n n n 的 01 01 01 字符串 s 1 s1 s1 和 s 2 s2 s2,以及一个正整数 x x x ,每次操作有两种选择:

  • 选择两个下标 i i i 和 j j j ,同时反转 s 1 i s1i s1i 和 s 1 j s1j s1j ,代价为 x x x
  • 选择一个下标 i i i 满足 i + 1 < n i+1<n i+1<n ,同时反转 s 1 i s1i s1i 和 s 1 i + 1 s1i+1 s1i+1 ,代价为 1 1 1

问使得 s 1 s1 s1 变为 s 2 s2 s2 的最小代价,如果不能使得 s 1 s1 s1 变为 s 2 s2 s2 ,返回 − 1 -1 −1

数据范围

  • 1 ≤ n , x ≤ 500 1\leq n,x\leq 500 1≤n,x≤500
  • s 1 s1 s1 和 s 2 s2 s2 均只包含字符 '0' 和 '1'

题解

这里 s 1 s1 s1 和 s 2 s2 s2 中不同的数位的数量必须为偶数,否则 s 1 s1 s1 必然无法变为 s 2 s2 s2

考虑 f i 0 / 1 fi0/1 fi0/1 表示将 s 1 s1 s1 的前 i i i 个字符反转使得 s 1 0 : i = s 2 0 : i s10:i=s20:i s10:i=s20:i 的最小代价。

其中 f i 1 fi1 fi1 表示选择了若干次操作 1 1 1 ,最后一次操作 1 1 1 只对下标 i i i 使用了,但是未对下标 j j j 使用,就是说我有且仅有存在一次操作 1 1 1 满足只选择了下标 i i i ,还未确定下标 j j j 。

状态转移:

cpp 复制代码
// 第 i 位选择操作 2
f[i][0] = min(f[i][0], f[i - 2][0] + p[i - 1] - p[i - 2]);
f[i][1] = min(f[i][1], f[i - 2][1] + p[i - 1] - p[i - 2]);
// 第 i 位选择操作 1
f[i][0] = min(f[i][0], f[i - 1][1]);
f[i][1] = min(f[i][1], f[i - 1][0] + x);

时间复杂度: O ( n ) O(n) O(n)

代码

cpp 复制代码
class Solution {
public:
    int minOperations(string s1, string s2, int x) {
        vector<int> p;
        for (int i = 0; i < s1.size(); ++i) 
            if (s1[i] != s2[i]) p.push_back(i);
        int m = p.size();
        if (m % 2 == 1) return -1;
        if (m == 0) return 0;

        vector<vector<int>> f(m + 1, vector<int>(2, 0x3f3f3f3f));
        f[0][0] = 0;
        f[1][1] = x;
        for (int i  = 2; i <= m; ++i) {
            // 第 i 位选择操作 2
            f[i][0] = min(f[i][0], f[i - 2][0] + p[i - 1] - p[i - 2]);
            f[i][1] = min(f[i][1], f[i - 2][1] + p[i - 1] - p[i - 2]);
            // 第 i 位选择操作 1
            f[i][0] = min(f[i][0], f[i - 1][1]);
            f[i][1] = min(f[i][1], f[i - 1][0] + x);
        }

        return f[m][0];
    }
};
相关推荐
招聘风控观察7 小时前
招聘质量管理是什么?招聘质量的定义与评价口径完整解释
职场和发展
徐小夕8 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao8 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄9 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘569 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
y1su11 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan12 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
其实防守也摸鱼12 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机13 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS10013 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构