c语言实现给定一个由 01 组成的字符串 s,你可以选择其中的一个连续子串,将其顺序左右反转。如 10011 反转后变为 11001。请你求出经过一次反转后,最长的连续 1 的长度是多少。
时间: 2024-02-05 12:11:16 浏览: 146
C语言中求字符串长度的函数的几种实现方法
5星 · 资源好评率100%
以下是用 C 语言实现的代码,时间复杂度为 O(n):
```c
#include <stdio.h>
#include <string.h>
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
char s[1000000];
scanf("%s", s);
int n = strlen(s);
int ans = 0;
int cnt = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '1') {
cnt++;
} else {
ans = max(ans, cnt);
cnt = 0;
}
}
ans = max(ans, cnt); // 处理最后一个连续的 1
cnt = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '0') {
cnt++;
} else { // 出现了 1,进行反转
ans = max(ans, cnt + 1); // 左侧的 0 和右侧的 1 合并
cnt = 0;
for (int j = i + 1; j < n; j++) { // 继续往右搜索
if (s[j] == '0') {
cnt++;
} else {
break;
}
}
ans = max(ans, cnt); // 更新最长的连续 0 的长度
cnt = 0;
}
}
ans = max(ans, cnt); // 处理最后一个连续的 0
printf("%d\n", ans);
return 0;
}
```
代码思路如下:
首先遍历一次字符串,记录当前连续的 1 的个数,遇到 0 就更新最长连续 1 的长度。然后再遍历一次字符串,遇到 0 就进行反转,将左侧的 0 和右侧的 1 合并,更新最长的连续 1 的长度,然后继续往右搜索,更新最长的连续 0 的长度。最后输出最长的连续 1 的长度即可。
阅读全文