这是一道模板题。 给定一个字符串 a和一个字符串 b,求 b 在 a 中的出现次数。a 和
时间: 2024-10-12 17:07:37 浏览: 105
这道题目是一个经典的字符串搜索问题,通常称为“查找子串出现次数”。给定两个字符串 a
和 b
,你需要计算 b
在 a
中能够连续出现多少次。这个过程可以通过滑动窗口或者哈希函数的方式来解决。
一种常见的方法是使用双指针技术,将b
视为一个固定长度的窗口,在a
中从左到右移动这个窗口,每次比较窗口内的字符是否与b
完全匹配,如果匹配则窗口向右移动一位,如果不匹配则窗口左移一位,直到遍历完整个a
。统计窗口完全匹配的次数即为b
的出现次数。
Python代码示例:
def count_substring(a, b):
if len(b) > len(a):
return 0
count = start = 0
while start < len(a) - len(b) + 1:
if a[start:start+len(b)] == b:
count += 1
start += len(b)
else:
start += 1
return count
相关问题
给定一个文本字符串 s和 m个模板,每个模板用 {i}(0≤i≤9)表示,对应一个字符串 ti,请将 s中的所有形如 {i} 的字符串替换为 ti,如果 s中包含多个 {i},则所有的 {i}均需要被替换成 ti。输入第一行包含一个字符串 s,表示给定的文本字符串。s的长度不超过 1000,保证 s中非模板部分只出现英文字母、英文标点(不包括 { 和 } )及空格。 第二行包含一个整数 m(1≤m≤10),表示模板数量。 接下来 m行,每行包含一个字符串 ti,表示第 i种模板。ti的长度不超过 1010,且只出现英文字母。输出一个字符串,表示替换后的字符串。用C语言
#include <stdio.h>
#include <string.h>
int main() {
char s[1001];
char t[11][1011];
fgets(s, 1001, stdin);
int m;
scanf("%d", &m);
getchar(); // 把回车符读掉
for (int i = 0; i < m; i++) {
fgets(t[i], 1011, stdin);
t[i][strlen(t[i])-1] = '\0'; // 把换行符替换成字符串结束符
}
for (int i = 0; i < 10; i++) {
char str[4]; // {i}的长度为3,再加上字符串结束符
sprintf(str, "{%d}", i); // 把{i}转换成字符串形式
for (int j = 0; j < strlen(s);) {
if (strncmp(str, s+j, 3) == 0) { // 判断是否匹配到了{i}
int k;
for (k = 0; k < m; k++) {
if (strncmp(str+1, t[k], strlen(t[k])) == 0) { // 判断是否有对应的模板
break;
}
}
if (k < m) { // 找到了对应的模板
memmove(s+j+strlen(t[k]), s+j+3, strlen(s)-j-2); // 把{s[i]}替换成ti
memcpy(s+j, t[k], strlen(t[k])); // 把ti复制到{s[i]}的位置
j += strlen(t[k]); // 跳过已经替换的部分
} else { // 没有找到对应的模板
j += 3; // 跳过{s[i]}
}
} else { // 没有匹配到{i}
j++;
}
}
}
printf("%s", s);
return 0;
}
C语言写程序给定一个文本字符串 s 和 m 个模板,每个模板用 {i}(0≤i≤9) 表示,对应一个字符串 ti ,请将 s 中的所有形如 {i} 的字符串替换为 ti ,如果 s 中包含多个 {i} ,则所有的 {i} 均需要被替换成 ti 。第一行包含一个字符串 s ,表示给定的文本字符串。s 的长度不超过 1000 ,保证 s 中非模板部分只出现英文字母、英文标点(不包括 { 和 } )及空格。 第二行包含一个整数 m(1≤m≤10) ,表示模板数量。 接下来 m 行,每行包含一个字符串 ti ,表示第 i 种模板。ti 的长度不超过 10 ,且只出现英文字母。测试用例为I have a {0}, I have an {1}. 2 pen apple结果应该为I have a pen, I have an apple.
以下是C语言的实现代码:
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000
#define MAX_TEMPLATE 10
#define TEMPLATE_LEN 10
char s[MAX_LEN + 1];
char templates[MAX_TEMPLATE][TEMPLATE_LEN + 1];
char output[MAX_LEN * 10 + 1]; // 预留足够的空间,避免越界
int main() {
fgets(s, MAX_LEN + 1, stdin);
int s_len = strlen(s);
if (s[s_len - 1] == '\n') {
s[s_len - 1] = '\0'; // 去掉换行符
s_len--;
}
int m;
scanf("%d\n", &m);
for (int i = 0; i < m; i++) {
fgets(templates[i], TEMPLATE_LEN + 1, stdin);
int template_len = strlen(templates[i]);
if (templates[i][template_len - 1] == '\n') {
templates[i][template_len - 1] = '\0'; // 去掉换行符
template_len--;
}
}
int output_pos = 0;
for (int i = 0; i < s_len; i++) {
if (s[i] == '{') {
int j = i + 1;
while (j < s_len && s[j] != '}') {
j++;
}
if (j >= s_len) {
printf("Error: unmatched { found!\n");
return 1;
}
s[i] = '\0'; // 把 { 变成字符串结尾,截取出非模板部分
char* template_index_str = s + i + 1;
int template_index = atoi(template_index_str);
if (template_index < 0 || template_index >= m) {
printf("Error: invalid template index %d!\n", template_index);
return 1;
}
strcat(output, s + output_pos); // 把非模板部分拼接到输出字符串
strcat(output, templates[template_index]); // 把模板字符串拼接到输出字符串
output_pos = j + 1; // 跳过模板字符串
i = j; // 跳过模板字符串
}
}
strcat(output, s + output_pos); // 把剩余的非模板部分拼接到输出字符串
printf("%s\n", output);
return 0;
}
具体思路如下:
- 读入字符串
s
和模板数量m
,以及m
个模板字符串。 - 从左到右遍历
s
,如果遇到一个{
,则找到对应的}
,把中间的字符串解析成模板索引,然后把中间的非模板部分和模板字符串拼接到输出字符串中。 - 最后把剩余的非模板部分拼接到输出字符串中。
- 输出最终的字符串。
需要注意的细节:
- 读入字符串时要注意去掉换行符。
- 如果解析模板索引失败,需要返回错误。
- 如果遇到未匹配的
{
或}
,需要返回错误。 - 预留足够的输出字符串空间,避免越界。
相关推荐
















