【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 ] s1[i] s1[i] 和 s 1 [ j ] s1[j] s1[j] ,代价为 x x x
  • 选择一个下标 i i i 满足 i + 1 < n i+1<n i+1<n ,同时反转 s 1 [ i ] s1[i] s1[i] 和 s 1 [ i + 1 ] s1[i+1] s1[i+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 ] f[i][0/1] f[i][0/1] 表示将 s 1 s1 s1 的前 i i i 个字符反转使得 s 1 [ 0 : i ] = s 2 [ 0 : i ] s1[0:i]=s2[0:i] s1[0:i]=s2[0:i] 的最小代价。

其中 f [ i ] [ 1 ] f[i][1] f[i][1] 表示选择了若干次操作 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];
    }
};
相关推荐
古译汉书22 分钟前
嵌入式-SPI番外之按钮驱动程序的编写-Day15
c语言·stm32·单片机·嵌入式硬件·mcu·算法
测试老哥30 分钟前
pytest+requests+allure自动化测试接入Jenkins学习
自动化测试·软件测试·学习·测试工具·职场和发展·jenkins·pytest
快去睡觉~1 小时前
力扣48:旋转矩阵
算法·leetcode·矩阵
卡洛斯(编程版2 小时前
(1) 哈希表全思路-20天刷完Leetcode Hot 100计划
python·算法·leetcode
NAGNIP3 小时前
DeepSeekMoE 架构解析
算法
不喜欢学数学er3 小时前
算法第五十二天:图论part03(第十一章)
算法·深度优先·图论
养成系小王3 小时前
四大常用排序算法
数据结构·算法·排序算法
NAGNIP3 小时前
一文搞懂DeepSeek LLM
算法
已读不回1433 小时前
设计模式-策略模式
前端·算法·设计模式
MrZhangBaby4 小时前
SQL-leetcode—3374. 首字母大写 II
linux·sql·leetcode