c语言实现:给你一个下标从 0 开始、长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 i )的所有字符,成本为 i + 1 。 选中一个下标 i 并且反转从下标 i 到下标 n - 1(包括下标 i 和下标 n - 1 )的所有字符,成本为 n - i 。 返回使字符串内所有字符 相等 需要的 最小成本 。
时间: 2024-02-13 08:05:18 浏览: 125
C语言代码,对字符串操作
以下是C语言实现代码:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int minCost(char *s) {
int n = strlen(s);
int i, j, cnt0 = 0, cnt1 = 0;
for (i = 0; i < n; i++) {
if (s[i] == '0') {
cnt0++;
} else {
cnt1++;
}
}
if (cnt0 > 0 && cnt1 > 0) { // 如果有不止一种字符,则无法将所有字符变为相等的
return -1;
}
int *cost = (int *)malloc(sizeof(int) * (n + 1));
memset(cost, 0, sizeof(int) * (n + 1));
for (i = 1; i <= n; i++) {
if (s[i-1] == '0') {
cost[i] = cost[i-1] + i;
} else {
cost[i] = cost[i-1];
}
}
int min_cost = INT_MAX;
for (i = 0; i <= n; i++) {
min_cost = min(min_cost, cost[i] + (n-i)*(n-i+1)/2 - (cost[n]-cost[i]));
}
free(cost);
return min_cost;
}
int main() {
char s[] = "00000";
printf("%d\n", minCost(s));
return 0;
}
```
其中,cost数组记录了反转前缀所需的成本,min_cost记录了反转前缀和反转后缀所需的最小成本。时间复杂度为O(n)。
阅读全文