【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];
    }
};
相关推荐
蛋蛋的就会顺顺的9 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙9 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
zhangfeng113310 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu
学代码的CJY10 小时前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
白帽攻防录11 小时前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
小O的算法实验室11 小时前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法
可乐ea12 小时前
AI Agent 工具调用准确性评测:选择错误与参数错误分开测
大数据·人工智能·算法·大模型·工具调用·ai智能体·agent评测
上位机妹子12 小时前
C 语言 数组删除指定元素(快慢指针法)
c语言·数据结构·算法
心中有你021412 小时前
【路径规划】A*寻路算法最通俗易懂讲解(C语言完整实现+详细注释)
c语言·开发语言·算法
papaofdoudou13 小时前
初中数学-整数整除判定法全解:从 2 到 19 的方法、依据与证明
算法