【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];
    }
};
相关推荐
Raink老师8 小时前
【AI面试临阵磨枪-70】Agent 系统如何做分布式调度、跨服务协作、故障恢复?
人工智能·面试·职场和发展
Raink老师8 小时前
【AI面试临阵磨枪-71】如何用 AI 优化推荐系统、内容审核、广告创意、搜索体验?
人工智能·面试·职场和发展
EllinY9 小时前
CF2217E Definitely Larger 题解
c++·笔记·算法·构造
Raink老师9 小时前
【AI面试临阵磨枪-72】电商全场景 AI Agent 设计(商品咨询 / 订单 / 物流 / 售后 / 退款)
人工智能·面试·职场和发展
玖釉-12 小时前
下一个排列:从字典序到原地算法的完整推导
数据结构·c++·windows·算法
IronMurphy12 小时前
【算法五十】62. 不同路径
算法
影寂ldy12 小时前
C#一维数组
算法
过期动态13 小时前
【LeetCode 热题 100】移动零
java·数据结构·算法·leetcode·职场和发展·rabbitmq
计算机安禾13 小时前
【算法分析与设计】第10篇:下界理论与NP完全性初步
大数据·人工智能·算法