1953-子串查找(模板题) ZCMU

这篇博客介绍了一个字符串匹配的问题,其中目标是计算字符串B在字符串A中出现的次数,允许子串重叠。提供了输入输出示例,并提示可以使用KMP算法来高效求解。题目限制了字符串长度在1到10^6之间,且只包含大小写字母。

Description

给定一个字符串 A 和一个字符串 B,求 B 在 A 中的出现次数。

A 中不同位置出现的 B 可重叠。

Input

输入共两行,分别是字符串 A 和字符串 B。

Output

输出一个整数,表示 B 在 A 中的出现次数。

Sample Input

zyzyzyz

zyz

Sample Output

3

HINT

1≤A,B 的长度 ≤106 ,A 、B 仅包含大小写字母。

解析

求子串出现了几次(可重叠),用KMP算法合适

代码

#include<stdio.h>
#include<string.h>
#define MAX 1000005
char mainstr[MAX],matchstr[MAX];
int p[MAX],lenofmain,lenofmatch;
void pre()
{
    int i,j=0; p[1]=0;
    for(i=1;i<lenofmatch;i++)
    {
        while(j>0&&matchstr[j+1]!=matchstr[i+1])
            j=p[j];
        if(matchstr[j+1]==matchstr[i+1])
            j++;
        p[i+1]=j;
    }
}
int KMP()
{
    int ans=0,j=0,i;
    for(i=0;i<lenofmain;i++)
    {
        while(j>
### 查找子串并替换的操作 在编程中,查找子串并替换是一个常见的需求。以下是关于如何通过 Java 实现这一功能的详细介绍。 #### 使用 `indexOf` 方法查找字符串 Java 提供了内置的方法来处理字符串中的子串查找问题。可以使用 `String.indexOf(String str)` 来定位目标子串的位置[^1]。如果找到该子串,则返回其起始索引;如果没有找到,则返回 `-1`。 ```java int index = originalStr.indexOf(targetSubstr); if (index != -1) { System.out.println("子串 '" + targetSubstr + "' 找到了, 起始位置为:" + index); } else { System.out.println("未找到子串"); } ``` #### 替换子字符串 对于替换操作,可以利用 `String.replace(CharSequence target, CharSequence replacement)` 或者更灵活的方式——正则表达式的匹配与替换函数 `replaceAll(String regex, String replacement)`。这些方法会创建一个新的字符串对象作为结果,因为原始字符串不可变。 下面展示了一个简单的例子: ```java // 原始字符串 String originalStr = "Hello world! Welcome to the world of Java."; // 需要被替换的目标子串 String targetSubstr = "world"; // 新的内容用于替代旧内容 String newContent = "universe"; // 进行全局替换 String replacedStr = originalStr.replaceAll(targetSubstr, newContent); System.out.println(replacedStr); // 输出: Hello universe! Welcome to the universe of Java. ``` 需要注意的是,在上述代码片段中调用了 `replaceAll()` 函数完成整个文档内的全部实例替换成新的值的任务。如果你只想做一次性的局部修改而非整体更改的话,那么可能还需要结合其他逻辑控制语句一起工作才行。 另外一种情况是当只需要部分区域内的特定模式进行调整时,可考虑先截取所需范围再单独处理后再拼接回去形成最终版本的数据结构形式如下所示: ```java // 定义原字符串以及边界条件 String fullText = "The quick brown fox jumps over a lazy dog."; int startIndex = 10; // 开始索引(包含) int endIndex = 19; // 结束索引(不包含) // 获取中间部分内容准备编辑 String midPart = fullText.substring(startIndex, endIndex).replace('o', 'a'); // 合前后两段保持不变的部分加上已改动后的中部得到新文本 String result = fullText.substring(0, startIndex) + midPart + fullText.substring(endIndex); System.out.println(result); // The quick brwn fx jmps aver a lazy dg. ``` 以上就是有关于如何在程序设计过程中实现针对给定输入数据执行查找出符合条件的小节之后实施相应变换的一些基本技巧介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值