跳到主要内容

2712.使所有字符相等的最小成本

链接:2712.使所有字符相等的最小成本
难度:Medium
标签:贪心、字符串、动态规划
简介:返回使字符串内所有字符 相等 需要的 最小成本 。

题解 1 - cpp

  • 编辑时间:2023-05-28
  • 执行用时:92ms
  • 内存消耗:30.8MB
  • 编程语言:cpp
  • 解法介绍:从中间向两边遍历。
class Solution {
public:
typedef long long ll;
ll minimumCost(string s) {
ll n = s.size(), m = n / 2;
function<ll(ll, ll, bool)> compL = [&](ll idx, ll target, bool rev) -> ll {
if (idx == -1) return 0;
ll val = s[idx] - '0';
if (rev) val ^= 1;
if (val == target) return compL(idx - 1, target, rev);
return compL(idx - 1, target, !rev) + (idx + 1);
};
function<ll(ll, ll, bool)> compR = [&](ll idx, ll target, bool rev) -> ll {
if (idx == n) return 0;
ll val = s[idx] - '0';
if (rev) val ^= 1;
if (val == target) return compR(idx + 1, target, rev);
return compR(idx + 1, target, !rev) + (n - idx);
};
return min(compL(m - 1, 0, false) + compR(m, 0, false), compL(m - 1, 1, false) + compR(m, 1, false));
}
};

题解 2 - cpp

  • 编辑时间:2023-05-28
  • 执行用时:20ms
  • 内存消耗:11.8MB
  • 编程语言:cpp
  • 解法介绍:一次遍历,遇到左右不等的,要不翻转左边,要不翻转右边。
class Solution {
public:
typedef long long ll;
ll minimumCost(string s) {
ll res = 0;
for (int i = 1; i < s.size(); i++) {
if (s[i] != s[i - 1]) res += min(i, (int)s.size() - i);
}
return res;
}
};

题解 3 - python

  • 编辑时间:2023-05-28
  • 执行用时:168ms
  • 内存消耗:16.7MB
  • 编程语言:python
  • 解法介绍:同上。
class Solution:
def minimumCost(self, s: str) -> int:
res = 0
for i in range(1, len(s)):
if s[i] != s[i - 1]: res += min(i, len(s) - i)
return res

题解 4 - rust

  • 编辑时间:2023-05-28
  • 内存消耗:2.7MB
  • 编程语言:rust
  • 解法介绍:同上。
pub fn str_to_vec(s: &String) -> Vec<char> {
s.chars().collect()
}
impl Solution {
pub fn minimum_cost(s: String) -> i64 {
let mut res = 0i64;
let s = str_to_vec(&s);
for i in 1..s.len() {
if s[i] != s[i - 1] {
res += i.min(s.len() - i) as i64;
}
}
res
}
}