【华为上机真题】寻找相同子串

news2025/1/18 12:44:13

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、题目描述

1.1 输入描述

1.2 输出描述

1.3 测试样例

1.3.1 示例 1

二、解题思路

三、代码实现

四、时间复杂度


一、题目描述

给你两个字符串 t 和 p,要求从 t 中找到一个和 p 相同的连续子串,并输出该子串的第一个字符的下标。

1.1 输入描述

输入包括两行,分别表示 t 和 p,保证t的长度不小于 p,而且t的长度不超过 1000000, p 的长度不超过 10000。

1.2 输出描述

如果能从 t 中找到一个和 p 相等的连续子串,则输出该子串第一个字符在 t 中的下标(下标以 1 开始);

如果不能则输出 “NO”;如果包含多个这样的子串,则输出第一个字符下标最小的那个。

1.3 测试样例

1.3.1 示例 1

输入

AVERDXIVYERDIAN
RDXI

输出

4

二、解题思路

本题主要考查 KMP 算法,直接使用 KMP 即可,注意结果的输出,不包含时输出 NO。

三、代码实现

代码实现如下所示。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

const int MS = 1000000 + 5;
int nextArr[MS];
void getNext(const string &p)
{
    nextArr[0] = 0;
    int n = p.length();
    for (int i = 1, j = 0; i < n; ++i) {
        while (j && p[i] != p[j])
            j = nextArr[j - 1];
        if (p[i] == p[j]){
            j++;
            nextArr[i] = j;
        }
    }
}
int kmp(const string &s, const string &p)
{
    int n = s.length();
    int m = p.length();
    for (int i = 0, j = 0; i < n; ++i) {
        while (j && s[i] != p[j])
            j = nextArr[j - 1];
        if (s[i] == p[j]) {
            j++;
        }
        if (j == m) {
            return i - j + 1;
        }
    }
    return -1; // 匹配失败
}

int main()
{
    string s;
    string p;
    while (getline(cin, s)) {
        getline(cin, p);
        getNext(p);
        int ans = kmp(s, p);
        if (ans == -1) {
            cout<< "NO" <<endl;
        } else {
            cout<< ans + 1 <<endl;
        }
    }

    return 0;
}

四、时间复杂度

时间复杂度:O(n + m)。

本题时间复杂度等于 KMP 算法的时间复杂度,假设原字符串的长度为 n,待查找的字符串的长度为 m,KMP 算法计算 next 数组的时间复杂度约为 [ m, 2 * m ],计算最终结果的时间复杂度为 [ n, 2 * n ],所以总的时间复杂度为 O (n + m)。 


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023牛客寒假算法集训营3

&#xff08;数学场真折磨人&#xff09; A. 不断减损的时间&#xff08;贪心&#xff09; 题意&#xff1a; 给定一个数组&#xff0c;任意次操作&#xff0c;每次操作可以 选择一个偶数除以 222 。 求最终数组所有元素之和的最小值。 思路&#xff1a; 要使得所有元素之…

(python)selenium工具的安装及其使用

selenium概述 一个自动化测试工具。它可以让python代码调用浏览器。并获取到浏览器中加载的各种资源 优缺点&#xff1a; 优点 selenium能够执行页面上的js&#xff0c;对于js渲染的数据和模拟登陆处理起来非常容易使用难度简单爬取速度慢&#xff0c;爬取频率更像人的行为&a…

k8s安装nfs设置pv pvc并部署mysql

在k8s系列第一篇中提到有一个用于nfs机器没有部署任何东西&#xff0c;这一篇我们来搭建nfs服务&#xff0c;并在k8s上部署mysql&#xff0c;并将mysql的data目录映射到nfs中。网上的部分教程为了简便教学用的hostPath做的映射&#xff0c;只是便于教学的简便做法&#xff0c;实…

Linux常用命令——skill命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) skill 向选定的进程发送信号冻结进程 补充说明 skill命令用于向选定的进程发送信号&#xff0c;冻结进程。这个命令初学者并不常用&#xff0c;深入之后牵涉到系统服务优化之后可能会用到。 语法 skill(选项…

vim的自动化配置(一条指令就够了)

应该没有人在因为vim中括号不能对齐和补齐和自动缩进而烦恼吧&#xff01; 自动化配置不香吗&#xff1f; 如果你想把你的vim给配置成像vs2022编译器一样&#xff0c;那么恭喜你&#xff0c;当你看到这篇文章的时候你就要成功了&#xff01; 一条指令&#xff0c;下载出vs20…

Java 分支及循环语句

文章目录一、分支语句1. if 语句2. switch 语句二、循环语句1. for 循环语句2. while 循环语句3. do...while 循环语句4. 跳转控制语句5. 循环嵌套6. Random6.1 猜数字游戏一、分支语句 1. if 语句 if(关系表达式1) {语句体1; } else if(关系表达式2){语句体2; } ... else {语…

带你去了解什么是makefile文件

GNU make命令是用来控制从源文件生成可执行文件或非可执行文件的方式。那么make命令又是通过makefile文件来控制了。所以了解makefile文件就显得很有必要了。 makefile文件由许多规则组成&#xff0c;这些规则的形式一般是这样的&#xff1a; 目标 ... : 先决条件 ...命令目标…

PMP范围和需求的区别是什么?

定义需求&#xff1a;为满足业务需求&#xff0c;某个产品、服务或成果必须达到的条件或具备的能力。范围&#xff1a;项目所提供的产品、服务和成果的总和。在PMI中我们常说的范围一般为项目范围&#xff0c;其定义为&#xff1a;为交付具有规定特性与功能的产品、服务或成果而…

现金+股票再平衡策略的测试 - 针对恒指

最近很多人在讨论一个策略&#xff0c;就是50%现金&#xff0c;50%ETF&#xff0c;然后按照一定的策略再平衡一次&#xff0c;将会获得比单纯股票投资更安全的策略和更加稳定的收益。我做了一个简单的回测。 测试模式1 1990-01-02 - 2023-01-20 长期涨模式 首先假设我找到了一…

Redis面试题万字汇总 [施工中]

1. Redis 数据结构Redis底层有五种数据结构,String, long / double : 底层是小于Long的数字时, 使用的时long字符.它也可以支持double类型浮点数,embstr : 如果是短字符串,长度小于39个字节, 使用的是embstr数据结构. 之所以是39字节,主要是redis的jemalloc最小单位是64个字节,…

深度估计源码详解

源码链接见文末 论文地址: Monocular Depth Estimation Using Laplacian Pyramid-Based Depth Residuals | IEEE Journals & Magazine | IEEE Xplore 1.项目环境配置 项目中所包含的库直接使用pip install就好,但是有3个地方需要处理一下: fcntl,这个需要打开anacon…

DFS(六) N皇后 II

n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/pr…

浮动 应用场景 浮动的基本特点 高度坍塌 解决浮动时盒子冲突问题

目录浮动应用场景浮动的基本特点盒子尺寸盒子排列文字环绕高度坍塌浮动 视觉格式化模型&#xff0c;大体上将页面中盒子的排列分为三种方式&#xff1a; 常规流浮动定位 应用场景 文字环绕横向排列 浮动的基本特点 修改float属性值为&#xff1a; left&#xff1a;左浮动…

【HBase入门】6. 常用 Shell 操作(3)

前言 我们可以以shell的方式来维护和管理HBase。例如&#xff1a;执行建表语句、执行增删改查操作等等。 过滤器的用法 过滤器一般结合scan命令来使用。打开HBase的JAVA API文档。找到RowFilter的构造器说明&#xff0c;我们来看以下&#xff0c;HBase的过滤器该如何使用。 …

快速排序的实现和优化~

相比于冒泡排序的改进点&#xff1a; 在前面学过的冒泡排序中&#xff0c;由于扫描过程只对相邻的两个元素进行比较&#xff0c;因此在互换两个相邻元素时&#xff0c;只能消除一个逆序&#xff0c;如果能通过两个(不相邻的)元素的交换&#xff0c;消除待排序记录 中的多个逆序…

docker desktop window10家庭版踩坑实录

安装 桌面版&#xff1a;https://www.docker.com/products/docker-desktop 这里我就安装的是桌面版 选择windows 前置工作 1.按下 wins&#xff08;找到这个&#xff09; 将下面的这个勾选中&#xff0c;如果你是家庭版很可能没有这个东西&#xff0c;那么请看我的这篇文章…

5-5中央处理器-指令流水线

文章目录一.基本概念1.多条指令在处理器中的执行方式&#xff08;1&#xff09;顺序执行方式/串行执行方式&#xff08;2&#xff09;流水线执行方式①一次重叠执行方式②二次重叠执行方式2.流水线的表示方法&#xff08;时空图&#xff09;3.超标量流水线二.分类1.部件功能级、…

第四十五章 动态规划——背包问题模型(二)

一、概述 我们在上一章中已经对背包模型做了一定地讲解&#xff0c;但是我们发现其实在上一章节中我们所介绍的例题大部分是给背包问题套上一个背景&#xff0c;当我们识破了背后的模型后&#xff0c;我们就可以直接套用模板&#xff0c;基本不需要对代码做改变。 那么在这一…

SpringBoot读写Redis客户端并实现技术切换(Jedis)

SpringBoot整合Redishttps://blog.csdn.net/weixin_51882166/article/details/128759780?spm1001.2014.3001.5501 读写客户端 首先应该打开redis服务&#xff1b; cd命令进入Redis安装目录下&#xff1a; 进入Redis客户端&#xff1a; redis-cli.exe -h 127.0.0.1 -p 6379…

梯度下降算法有哪些?有什么区别?【背景、原理、公式、代码】

一、梯度下降算法背景 梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯…