C语言:给定一个长度为n的字符串S和有一个数字a,统计长度大于等于a的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。编程要求:第一行输入数字a。 第二行输入字符串S。第三行输出结果
时间: 2023-06-01 19:03:39 浏览: 87
输入样例:
3
abcbcbcbcd
输出样例:
3
bcbc
解题思路:
1. 遍历所有长度大于等于a的子串,存储在一个字符串数组中。
2. 对字符串数组进行排序,按照出现次数从大到小排序,如果出现次数相同,则按照长度从大到小排序,如果长度也相同,则按照第一次出现的位置从小到大排序。
3. 输出排完序后的第一个元素,即为出现次数最多且长度最长、第一次出现最早的子串。
AC代码:
相关问题
使用C语言编码:给定一个长度为n的字符串S和有一个数字a,统计长度大于等于a的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。编程要求:第一行输入数字a。 第二行输入字符串S。第三行输出结果
```c
#include <stdio.h>
#include <string.h>
#define MAX_N 1000000
char S[MAX_N + 1];
int cnt[MAX_N + 1];
int main() {
int a, n;
scanf("%d%s", &a, S);
n = strlen(S);
int max_cnt = 0, max_len = 0, max_pos = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + a; j <= n; ++j) {
int len = j - i;
cnt[len] += (strncmp(S + i, S + j, len) == 0);
if (cnt[len] > max_cnt || (cnt[len] == max_cnt && len > max_len)) {
max_cnt = cnt[len];
max_len = len;
max_pos = i;
}
}
}
printf("%.*s\n", max_len, S + max_pos);
return 0;
}
```
c语言:对于一个字符串来说,定义一次循环移位操作为:将字符串 的第一个字符移动到末尾形成新的字符串。现给定两个字符串 s1 和 s2(字符串长度不超过 30,且仅为数字和字母),两个字 符串分别
在C语言中,对两个字符串`s1`和`s2`执行循环移位操作,即将`s1`的第一个字符移到末尾,可以分为以下几个步骤:
1. **获取第一个字符**:
使用指针指向字符串的第一个字符,例如:`char first_char = s1[0];`
2. **删除第一个字符**:
如果字符串长度大于1,使用数组切片的方式将第一个字符从原位置删除,然后向左移动其他元素。例如,如果`s1`是一个动态分配的数组,可以做类似`memmove(&s1[1], &s1[0], strlen(s1) - 1);`的操作。
3. **将第一个字符添加到末尾**:
将`first_char`赋值回原来的位置,即`s1[strlen(s1)] = first_char;`
4. **处理`s2`字符串**:
对`s2`做同样的操作,如果它不是空字符串的话。
5. **拼接结果**:
最后,需要连接`s1`和`s2`。如果是固定大小的字符数组,可能会涉及到动态内存调整;如果它们是单独的变量,可以直接用`strcat`函数合并。
下面是一个简单的示例函数来完成这个操作:
```c
#include <string.h>
void circular_shift(char* s1, char* s2) {
if (strlen(s1) > 0) {
char temp = s1[0];
memmove(s1, s1 + 1, strlen(s1) - 1);
s1[strlen(s1)] = temp;
// 处理s2,如果有内容
if (strlen(s2) > 0) {
temp = s2[0];
memmove(s2, s2 + 1, strlen(s2) - 1);
s2[strlen(s2)] = temp;
}
}
}
```
阅读全文