当前位置: 首页 > news >正文

华为OD机试真题---关联子串

华为OD机试中的“关联子串”题目是一个考察字符串处理和算法理解的经典问题。以下是对该题目的详细解析:

一、题目描述

给定两个字符串str1 和 str2,如果字符串 str1 中的字符,
经过排列组合后的字符串中只要有一个是 str2 的子串,
则认为 str1 是 str2 的关联子串,若不是关联子串则返回 -1
示例:
输入:

abc efghicaibii

输出:

-1

预制条件:
1.输入的字符串只包含小写字母
2.两个字符串的长度范围1~100000
3.若 str2 中有多个 str1 的组合子串,请返回第一个子串的起始位置
备注:输入字符串只包含小写,长度 1~100000

二、输入描述

输入两个字符串,分别为题目中描述的str1和str2。输入的字符串只包含小写字母,且两个字符串的长度范围在1到100000之间。

三、输出描述

如果str1是str2的关联子串,则返回子串在str2中的起始位置。如果不是关联子串,则返回-1。若str2中有多个str1的组合子串,则返回最小的起始位置。

四、解题思路

  1. 滑动窗口与字符频率匹配

    • 滑动窗口:用于遍历 str2 的所有可能的子串,这些子串的长度与 str1 相同。
    • 字符频率匹配:通过比较两个字符串的字符频率,可以快速判断一个字符串是否是另一个字符串的排列。这是因为排列仅仅是字符的顺序不同,而字符的数量和种类完全相同。
  2. 边界条件处理

    • 虽然题目已经规定了字符串的长度范围,并且确保两个字符串都是小写字母,但在实际编码中仍需注意输入验证。例如,输入可能包含多余的空格,或者输入的字符串不符合题目要求。
    • 特别要注意的是,当 str1 的长度大于 str2 时,直接返回 -1,因为不可能在较短的字符串中找到较长的字符串的排列。
  3. 性能优化

    • 使用数组记录字符频率而不是哈希表,是因为题目限制字符集为小写字母(共26个),这样可以节省空间并且提高访问速度。
    • 每次只遍历 str2 的必要部分(即从 0len2 - len1),避免了不必要的计算。

五、示例代码(Java)

import java.util.Scanner;public class AssociatedSubstring {/*** 主函数入口* 本程序用于判断第二个字符串是否是第一个字符串的排列,并输出其起始位置* @param args 命令行参数*/public static void main(String[] args) {// 创建Scanner对象,用于读取输入Scanner sc = new Scanner(System.in);// 读取一行输入,并根据空格分割成两个字符串String[] str = sc.nextLine().split(" ");// 提取分割后的字符串数组中的第一个元素String str1 = str[0];// 提取分割后的字符串数组中的第二个元素String str2 = str[1];// 计算第一个字符串的长度int len1 = str1.length();// 计算第二个字符串的长度int len2 = str2.length();// 定义目标索引,默认为-1,表示未找到int targetIndex = -1;// 遍历第二个字符串,寻找第一个字符串的排列for (int i = 0; i <= len2 - len1; i++) {// 截取当前遍历位置开始,与第一个字符串等长的子字符串String tmp = str2.substring(i, i + len1);// 判断截取的子字符串是否是第一个字符串的排列if (isPermutation(str1, tmp)) {// 如果是排列,记录起始索引targetIndex = i;// 找到后即可退出循环break;}}// 输出目标索引System.out.println(targetIndex);}/*** 判断两个字符串是否为互为排列* 排列是指两个字符串可以通过重新排列各自的字符而相互转换* 本方法通过比较两个字符串中每个字符的频率来判断它们是否为排列* * @param s1 第一个字符串,不区分大小写* @param s2 第二个字符串,不区分大小写* @return 如果s1和s2是排列关系,则返回true;否则返回false*/private static boolean isPermutation(String s1, String s2) {// 初始化两个数组,用于统计s1和s2中每个字母的出现次数int[] count1 = new int[26];int[] count2 = new int[26];// 统计s1中每个字符的频率for (char c : s1.toCharArray()) {count1[c - 'a']++;}// 统计s2中每个字符的频率for (char c : s2.toCharArray()) {count2[c - 'a']++;}// 比较两个字符频率数组for (int i = 0; i < 26; i++) {// 如果两个数组中当前位置的计数不相等,则字符串不是排列if (count1[i] != count2[i]) {return false;}}// 所有字符频率都相等,字符串是排列return true;}
}
六、示例代码详解
  • 输入处理:使用 Scanner 读取输入,并用 split 方法分割成两个字符串。这里假设输入格式严格符合题目要求,即两个字符串之间用空格分隔。
  • 滑动窗口:在 for 循环中,使用 substring 方法截取 str2 的子串,子串的长度与 str1 相同。
  • 字符频率匹配isPermutation 方法通过两个长度为26的数组记录两个字符串的字符频率,并逐项比较。如果所有字符的频率都相同,则这两个字符串是排列关系。
  • 结果输出:一旦找到匹配的子串,记录其起始位置并立即退出循环,因为题目要求返回第一个匹配子串的起始位置。
特殊情况处理
  • 空字符串:虽然题目已经排除这种情况,但理论上,如果 str1str2 为空,则可以直接返回 -1,因为空字符串不能构成任何非空字符串的排列。
  • 完全相同:如果 str1 正好是 str2 的一个子串(包括顺序相同),该算法仍然有效,因为完全相同的字符串也是排列关系的一种特殊情况。

七、运行示例解析

解析步骤

1、读取输入并分割字符串

  • Scanner 对象读取输入 abc efghicaibii。
  • 使用 split(" ") 方法将输入按空格分割成两个字符串数组 str。
  • str[0] 是 “abc”,str[1] 是 “efghicaibii”。

2、计算字符串长度

  • str1 的长度 len1 是 3。
  • str2 的长度 len2 是 11。

3、初始化目标索引

  • targetIndex 初始化为 -1,表示未找到排列。

4、遍历 str2 寻找排列

  • 循环从 i = 0 到 i = len2 - len1,即从 i = 0 到 i = 8。
  • 在每次循环中,截取 str2 中从 i 开始,长度为 len1 的子字符串 tmp,并与 str1 比较是否为排列。

5、具体遍历过程

  • i = 0 时,tmp = “efg”,调用 isPermutation(“abc”, “efg”) 返回 false。
  • i = 1 时,tmp = “fgh”,调用 isPermutation(“abc”, “fgh”) 返回 false。
  • i = 2 时,tmp = “ghi”,调用 isPermutation(“abc”, “ghi”) 返回 false。
  • i = 3 时,tmp = “hic”,调用 isPermutation(“abc”, “hic”) 返回 false。
  • i = 4 时,tmp = “ica”,调用 isPermutation(“abc”, “ica”) 返回 false。
  • i = 5 时,tmp = “cai”,调用 isPermutation(“abc”, “cai”) 返回false。
  • i = 6时,tmp = “aib”,调用 isPermutation(“abc”, “aib”) 返回false。
  • i = 7 时,tmp = “ibi”,调用 isPermutation(“abc”, “ibi”) 返回false。
  • i = 8 时,tmp = “bii”,调用 isPermutation(“abc”, “bii”) 返回false。

6、输出结果

  • 最终输出 targetIndex,即 -1。
输出
-1

八、注意事项

  1. 性能优化:由于字符串长度可能达到100000,因此需要注意算法的时间复杂度。上述代码使用了滑动窗口和字符频率匹配的方法,时间复杂度为O(n*m),其中n为str2的长度,m为str1的长度。在大多数情况下,这种方法是高效的。
  2. 边界条件:需要处理一些边界情况,如str1或str2为空字符串,或者str1的长度大于str2的长度等。这些边界情况在题目描述中通常已经明确排除。

通过以上解析和示例代码,相信你可以更好地理解并解决华为OD机试中的“关联子串”问题。

相关文章:

华为OD机试真题---关联子串

华为OD机试中的“关联子串”题目是一个考察字符串处理和算法理解的经典问题。以下是对该题目的详细解析&#xff1a; 一、题目描述 给定两个字符串str1 和 str2&#xff0c;如果字符串 str1 中的字符&#xff0c; 经过排列组合后的字符串中只要有一个是 str2 的子串&#xff…...

【OpenAI】第二节(Token)什么是Token?如何计算ChatGPT的Token?

深入解析&#xff1a;GPT如何计算Token数&#xff1f;让你轻松掌握自然语言处理的核心概念&#xff01;&#x1f680; 在当今的人工智能领域&#xff0c;GPT&#xff08;Generative Pre-trained Transformer&#xff09;无疑是最受关注的技术之一。无论是在文本生成、对话系统…...

GraphRAG + Ollama + Groq 构建知识库 续篇 利用neo4j显示知识库

GraphRAG Ollama Groq 构建知识库 在上一篇文章中&#xff0c;我们详细介绍了如何创建一个知识库。尽管知识库已经建立&#xff0c;但其内容的可视化展示尚未实现。我们无法直接看到知识库中的数据&#xff0c;也就无法判断这些数据是否符合我们的预期。为了解决这个问题&…...

工业以太网之战:EtherCAT是如何杀出重围的?

前言 EtherCAT 是一种开放的实时工业以太网协议&#xff0c;由德国倍福公司开发并在 2003 年 4 月的汉诺威工业博览会上首次亮相&#xff0c;目前由 EtherCAT 技术协会&#xff08;ETG&#xff09;进行维护和推广。经过 21 年的不断发展&#xff0c;EtherCAT 显示出极强的生命…...

轻量级可视化数据分析报表,分组汇总表!

什么是可视化分组汇总表&#xff1f; 可视化分组汇总表&#xff0c;是一种结合了数据分组、聚合计算与视觉呈现功能的数据分析展示功能。它能够按照指定的维度&#xff08;如时间、地区、产品类型等&#xff09;对数据进行分组&#xff0c;还能自动计算各组的统计指标&#xf…...

初始Python篇(4)—— 元组、字典

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 元组 相关概念 元组的创建与删除 元组的遍历 元组生成式 字典 相关概念 字典的创建与删除 字典的遍历与访问 字典…...

C#中正则表达式

在C#中&#xff0c;正则表达式由 System.Text.RegularExpressions 命名空间提供&#xff0c;可以使用 Regex 类来处理正则表达式。以下是一些常见的用法及示例。 C# 中使用正则表达式的步骤&#xff1a; 引入命名空间&#xff1a; using System.Text.RegularExpressions; 创…...

【python写一个带有界面的计算器】

python写一个带有界面的计算器 为了创建一个带有图形用户界面&#xff08;GUI&#xff09;的计算器&#xff0c;我们可以使用Python的tkinter库。tkinter是Python的标准GUI库&#xff0c;它允许我们创建窗口、按钮、文本框等GUI元素。 下面是一个简单的带有GUI的计算器示例&a…...

K230获取单摄像头的 3 个通道图像并显示在 HDMI 显示器上

本示例打开摄像头&#xff0c;获取 3 个通道的图像并显示在 HDMI 显示器上。通道 0 采集 1080P 图像&#xff0c;通道 1 和通道 2 采集 VGA 分辨率的图像并叠加在通道 0 的图像上。 # Camera 示例 import time import os import sysfrom media.sensor import * from media.dis…...

nginx中的HTTP 负载均衡

HTTP 负载均衡&#xff1a;如何实现多台服务器的高效分发 为了让流量均匀分配到两台或多台 HTTP 服务器上&#xff0c;我们可以通过 NGINX 的 upstream 代码块实现负载均衡。 方法 在 NGINX 的 HTTP 模块内使用 upstream 代码块对 HTTP 服务器实施负载均衡&#xff1a; upstr…...

package.json 里的 dependencies和devDependencies区别

dependencies&#xff08;依赖的意思&#xff09;&#xff1a; 通过 --save 安装&#xff0c;是需要发布到生产环境的。 比如项目中使用react&#xff0c;那么没有这个包的依赖就会报错&#xff0c;因此把依赖写入dependencies npm install <package-name>// 缩写 np…...

【功能安全】HARA分析中的SEC如何确认

目录 01 SEC介绍 02 SEC怎么定义 📖 推荐阅读 01 SEC介绍 SEC定义 S代表safety,E指的是Exposure,C指的是Controllability ASIL等级就是基于SEC三个参数确定下来的。 计算公式:10=D,9=C,8=B,7=A,<7=QM 举例:S3-C2-E4,即3+2+4=9,ASIL C 02 SEC怎么定义 Safe…...

阿里云Docker镜像源安装Docker的步骤

阿里云 Docker 镜像源安装 Docker 的步骤&#xff1a; 1. 更新包管理器&#xff1a; sudo apt update 2. 安装 Docker 的依赖包&#xff1a; sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release 3. 添加阿里云 Docker 镜像源 GP…...

得一微全资子公司硅格半导体携手广东工业大学,荣获省科学技术奖一等奖

10月17日&#xff0c;全省科技大会在广州召开&#xff0c;会上颁发了2023年度广东省科学技术奖。得一微电子旗下全资子公司深圳市硅格半导体有限公司&#xff08;以下简称“硅格半导体”&#xff09;与广东工业大学&#xff08;以下简称&#xff1a;广工大&#xff09;携手多家…...

@SneakyThrows不合理使用,是真的坑

public static void main(String[] args) {int a 1;int b 2;String result getResult(a, b);System.out.println(result);}SneakyThrowspublic static String getResult(Integer a,Integer b){if (a.equals(b)){return "成功&#xff01;";}else{throw new Interru…...

怎么把ppt页面切换为竖页?首推使用这个在线ppt工具!

熟悉ppt的朋友都知道&#xff0c;最常见的ppt演示文稿为横版样式&#xff0c;且一旦确定了ppt的版式&#xff0c;后续所有页面会保持相同的大小&#xff0c;但有时横版不能满足我们需求&#xff0c;想单独把其中一页或多页变为竖页&#xff0c;Office Powerpoint就无能为力了。…...

【JavaEE】——自定义协议方案、UDP协议

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;自定义协议 1&#xff1a;自定义协议 &#xff08;1&#xff09;交互哪些信息 &…...

python爬虫快速入门之---Scrapy 从入门到包吃包住

python爬虫快速入门之—Scrapy 从入门到包吃包住 文章目录 python爬虫快速入门之---Scrapy 从入门到包吃包住一、scrapy简介1.1、scrapy是什么?1.2、Scrapy 的特点1.3、Scrapy 的主要组件1.4、Scrapy 工作流程1.5、scrapy的安装 二、scrapy项目快速入门2.1、scrapy项目快速创建…...

【Photoshop——肤色变白——曲线】

1. 三通道曲线原理 在使用RGB曲线调整肤色时&#xff0c;你可以通过调整红、绿、蓝三个通道的曲线来实现黄皮肤到白皮肤的转变。 黄皮肤通常含有较多的红色和黄色。通过减少这些颜色的量&#xff0c;可以使肤色看起来更白。 具体步骤如下&#xff1a; 打开图像并创建曲线调…...

[python]从零开始的API调用教程

一、API是什么&#xff1f; API即应用程序编程接口&#xff0c;是一组定义了不同软件系统或组件之间如何交互的规则和协议。API为开发者提供了一种简化的方式&#xff0c;通过预定义的函数或方法&#xff0c;来使用某个软件、库、操作系统或硬件的功能&#xff0c;而不需要深入…...

同步、异步与互斥:从通用OS到RTOS的全面解析

一、基础概念&#xff1a;进程与线程1.1 什么是进程&#xff1f;进程是操作系统进行资源分配和调度的基本单位&#xff0c;是一个正在运行的程序实例。1.2 什么是线程&#xff1f;线程是操作系统进行CPU调度的基本单位&#xff0c;是进程内部的一条执行路径&#xff08;轻量级进…...

网络安全有哪些岗位?如何成为一名优秀的网络安全工程师?

网络安全有哪些岗位&#xff1f;如何成为一名优秀的网络安全工程师&#xff1f; 网络安全是什么&#xff1f; 首先说一下什么是网络安全&#xff1f;其中&#xff0c;网络安全工程师工作内容具体有哪些&#xff1f; 网络安全 确保网络系统的硬件、软件及其系统中的数据受到保护…...

伊犁盛夏赴花海,霍城紫浪漫卷天山脚下

在新疆伊犁哈萨克自治州霍城县&#xff0c;天山北麓的缓坡地带铺展着国内规模最大的薰衣草种植区。每年夏季&#xff0c;这片土地被大面积的薰衣草覆盖&#xff0c;呈现出连绵的紫色景观。霍城与法国普罗旺斯、日本北海道富良野地处相近纬度&#xff0c;气候条件适宜薰衣草生长…...

Perplexity股票数据清洗SOP(含NASDAQ非标字段映射表):金融工程师内部使用的12项校验规则

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity股票信息检索 Perplexity AI 公司尚未上市&#xff0c;因此不存在公开交易的股票代码、实时行情或交易所挂牌信息。这一事实常被开发者和投资者误读&#xff0c;尤其在使用金融数据 API 时容易触发…...

视听融合新范式!黎阳之光打破视觉边界,声影协同赋能全域智慧管控

长久以来&#xff0c;图形图像可视化技术早已成为智慧安防、低空管控、工业监测领域的主流应用&#xff0c;依托高清视频、三维实景、数字孪生图形图像能力&#xff0c;实现场景直观呈现、目标可视追踪、环境全景复刻&#xff0c;为各行各业搭建起可视化智慧管理体系。深耕图形…...

[Android] 文案设计助手_24.06.25

[Android] 文案设计助手_24.06.25 链接&#xff1a;https://pan.xunlei.com/s/VOszMVvm4BmG5za6Ib11nfGrA1?pwdsg9f# 文案设计助手&#xff0c;助您文案生成、自动写作&#xff0c;模拟手写生成器。免登陆&#xff0c;下载即用&#xff0c;无需会员。...

红外图像/红外遥感图像/可见光红外图像对 近红外和可见光成对图像 生成对抗网络的风格迁移,或者图像融合/图像生成/图像转换 可见光遥感生成红外遥感图像,37500对图像数据

红外图像/红外遥感图像/可见光红外图像对 近红外和可见光成对图像 生成对抗网络的风格迁移&#xff0c;或者图像融合/图像生成/图像转换 可见光遥感生成红外遥感图像&#xff0c;37500对图像数据 文章目录**数据集描述&#xff1a;**&#x1f9fe; 项目背景&#x1f9f0; 一、环…...

10分钟掌握Dism++:Windows系统优化终极完整指南

10分钟掌握Dism&#xff1a;Windows系统优化终极完整指南 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 还在为Windows系统越来越慢而烦恼吗&#xff1f;磁盘空…...

如何用Inkscape实现专业级光学设计?终极免费光线追踪插件完整指南

如何用Inkscape实现专业级光学设计&#xff1f;终极免费光线追踪插件完整指南 【免费下载链接】inkscape-raytracing An extension for Inkscape that makes it easier to draw optical diagrams. 项目地址: https://gitcode.com/gh_mirrors/in/inkscape-raytracing 你…...

企业级应用如何通过Taotoken实现API Key的精细化管理与审计

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 企业级应用如何通过Taotoken实现API Key的精细化管理与审计 在构建基于大模型的企业级应用时&#xff0c;API Key的管理与安全审计…...