【华为OD题库-061】关联子串-java

题目

给定两个字符串str1和str2,
str1进行排列组合,只要有一个为str2的子串则认为str1是str2的关联子串,请返回子串在str2的起始位置,若不是关联子串则返回-1。
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例输入
abc efghicbaili
输出
5
示例2
输入输出示例仅供调试,后台判题数据一般不包含
示例输入
abc efghiccaii
输出
-1

思路

题目隐含的条件应该是找到第一个匹配的子串。否则,可能有多种解
比如对于输入:cbcd adbccdebed。cbcd的排列组合可能有:dbcc,bccd等,如果先遍历的bccd那么得到的答案是2,如果先遍历dbcc得到的是1。

本题可以从排列组合和滑动窗口两个角度考虑解决

排列组合

组合模板见:【JAVA-排列组合】一个套路速解排列组合题。不赘述

找到str1所有的排列情况,依次遍历其是否是str2的子串。

滑动窗口

维护一个长度和str1等长的滑动窗口,判断窗口内的值是否和str1匹配,如果匹配,直接输出窗口左边界,否则右移滑动窗口
判断窗口内是否和str1匹配:每个字符数出现次数相等或者将两者按照同一逻辑排序,排序后相等则两者匹配

题解

排列组合解法

package hwod;import java.util.*;public class RelationSubStr {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] input = sc.nextLine().split(" ");String str1 = input[0];String str2 = input[1];System.out.println(relationSubStr(str1, str2));}private static List<String> res = new ArrayList<>();//存放字符串1所有可能的排列// 暴力解法private static int relationSubStr(String str1, String str2) {char[] chars = str1.toCharArray();int[] used = new int[str1.length()];dfs(chars, "", used);int ans = str2.length();for (int i = 0; i < res.size(); i++) {int tmp = str2.indexOf(res.get(i));if (tmp != -1 && tmp < ans) {ans = tmp;}}return ans == str2.length() ? -1 : ans;}private static void dfs(char[] chars, String str, int[] used) {if (str.length() == chars.length) {res.add(str);}for (int i = 0; i < chars.length; i++) {if (used[i] == 1) continue;str += chars[i];used[i] = 1;dfs(chars, str, used);str = str.substring(0, str.length() - 1);used[i] = 0;}}
}

滑动窗口解法

package hwod;import java.util.*;public class RelationSubStr {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] input = sc.nextLine().split(" ");String str1 = input[0];String str2 = input[1];System.out.println(relationSubStr(str1, str2));}//滑动窗口private static int relationSubStr(String str1, String str2) {Map<Character, Integer> map1 = new HashMap<>();Map<Character, Integer> map2 = new HashMap<>();for (int i = 0; i < str1.length(); i++) {map1.put(str1.charAt(i), map1.getOrDefault(str1.charAt(i), 0) + 1);}int size = str1.length();int k = 0;while (k < str2.length()) {map2.put(str2.charAt(k), map2.getOrDefault(str2.charAt(k), 0) + 1);int i = k - size + 1;if (i < 0) {k++;continue;}if (checked(map1, map2)) {return i;}map2.put(str2.charAt(i), map2.getOrDefault(str2.charAt(i), 0) - 1);k++;}return -1;}private static boolean checked(Map<Character, Integer> map1, Map<Character, Integer> map2) {for (Character key : map1.keySet()) {if (!map2.containsKey(key)) return false;if (!map1.get(key).equals(map2.get(key))) return false;}return true;}
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

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

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

相关文章

未势能源亮相中国燃料电池汽车大会,助力京津冀“氢能高速”

2023年12月1日&#xff0c;首届中国燃料电池汽车大会在大兴国际氢能示范区举办。大会由北京市经济和信息化局、北京市大兴区人民政府、中国汽车技术研究中心有限公司共同主办。中国科学技术协会主席万钢作主旨报告&#xff0c;国务院国资委副主任苟坪&#xff0c;中国科学院院士…

CO11N报工时,在填入返工数量后自动产生返工工单

本文档主要说明一种返工流程,当工人报工时,填写返工数量、变式原因即可启动触发点自动创建返工订单,被创建的反工订单为无料号生产订单,且关联报工订单。涉及系统功能点包括状态参数 一、 后台配置 1).用户状态参数:BS02(SPRO-生产-商店低价控制-主数据-订单-定义状态…

无公网IP环境固定地址远程SSH访问本地树莓派Raspberry Pi

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

Java中synchronized与Lock的区别与使用

Java中synchronized与Lock的区别与使用 当我们谈论Java多线程编程时&#xff0c;线程同步是一个避免资源竞争和保证线程安全的关键概念。在Java中&#xff0c;主要有两种机制来实现线程同步&#xff1a;synchronized关键字和Lock接口。这篇博客将详细介绍这两种同步机制的区别…

专业做除甲醛净化器的品牌 甲醛净化器什么牌子最好用

室内产生了超标的甲醛&#xff0c;大部分都会采取选择甲醛空气净化器来去除&#xff0c;甲醛净化器逐渐成为室内清除甲醛的主力&#xff0c;在选择甲醛净化器时&#xff0c;人们常常会被市场上琳琅满目的空气净化器品牌所迷惑&#xff0c;各品牌和型号都声称自己最好&#xff0…

C++构造函数与析构函数介绍

介绍 C中的构造函数和析构函数是类的特殊成员函数&#xff0c;用于初始化和清理对象。 构造函数是在创建对象时自动调用的函数。它的主要目的是初始化对象的状态。构造函数的名称与类的名称相同&#xff0c;并且它不返回任何类型&#xff0c;也没有参数。析构函数与构造函数相…

freeRTOS创建任务

一.动态创建任务 1.函数xTaskCreate() BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数const char * const pcName, // 任务的名字const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节void * const pvParameters, // …

CCFCSP试题编号:202006-2试题名称:稀疏向量

不断匹配相乘累加就好了 #include<iostream> #include<vector> #include <utility> using namespace std;int main() {int n;int a, b;long long result0; // 使用 long long cin >> n >> a >> b;vector<pair<int, int> > u…

删除不掉node_modules的办法

全局安装 rimraf 模块到系统下&#xff1a; npm install -g rimraf CD 到相应文件夹&#xff0c;执行如下指令&#xff1a; rimraf node_modules

Python面向对象⑤:多态【侯小啾Python基础领航计划 系列(二十三)】

Python面向对象⑤:多态【侯小啾Python基础领航计划 系列(二十三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

pta模拟赛(7-21 求A除以B的商与余数、7-22 一元多项式求导、7-23 一元多项式的乘法与加法运算、7-24 多项式A除以B、7-25 人以群分)

7-21 求A除以B的商与余数 计算A/B的商和余数&#xff0c;其中被除数A是不超过1000位的非负整数&#xff0c;除数B是一个不超过229的任意非负整数。要求你输出商Q和余数R。 输入格式: 输入在一行中依次给出 A 和 B&#xff0c;中间以空格分隔。 输出格式: 在一行中依次输出 Q 和…

minio服务端搭建使用

一.minio文件服务搭建 非docker环境部署(Linux部署) 1.官网下载安装包&#xff1a;MinIO | Code and downloads to create high performance object storage 2、上传安装包文件到目录(这个可以自由选择) /home/minio/ 3、为minio添加权限 sudo chmod x minio 4、 创建mini…

开关柜无线测温系统

开关柜无线测温系统是一种基于无源无线通信技术的开关柜温度监测系统&#xff0c;依托电易云-智慧电力物联网实现高压开关柜接头温度的在线监测和报警。该系统通过在开关柜内部安装无线温度探测器&#xff0c;实时监测开关柜内部的接头、电缆接头、母排等的温度监控&#xff0c…

深入理解 Go 语言中的接口(interface)

一、GoLang 接口的定义 1、GoLang 中的接口 在 Go 语言中接口&#xff08;interface&#xff09;是一种类型&#xff0c;一种抽象的类型接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范不实现&#xff0c;由具体的对象来实现规范的细节…

0年费、0月费、免kyc,支持ChatGPTPlus充值虚拟卡

虚拟卡通常是指银行卡的虚拟卡&#xff0c;是在银行卡的基础上的银联、VISA、万事达卡BIN码衍生出的一种虚拟账户。虚拟卡一般都是用于网络上无卡支付&#xff0c;因此虚拟卡都不会配备相应的实体卡片。银行卡的虚拟卡&#xff0c;在分类上与实体卡并无什么区别&#xff0c;也分…

JAVA 可执行文件格式

JAVA 可执行文件格式 springboot 程序使用 Maven PLugin插件编译时&#xff0c;可以生成可执行的 jar 和 war 程序。其核心原理是 spring-boot-loader 模块&#xff0c;详细原理如下 1 嵌套 JARS java 本身不支持任何标准的加载嵌套 jar 的方式&#xff0c;要解决该问题&…

探秘高级代理技术:SK5代理在网络安全中的应用

在当今数字化时代&#xff0c;网络安全和隐私保护日益受到重视。作为网络工程师和网络文章主编&#xff0c;我将为您介绍一种强大而高级的代理技术——SK5代理&#xff0c;并探讨其在网络安全、爬虫以及HTTP通信中的重要应用。 1. SK5代理简介 SK5代理是一种基于SOCKS5协议的…

学SQL JOINS看这一篇文章就够了

目录 下面以实例进行分析 内连接 inner join 或者join&#xff08;等同于inner join&#xff09; 外连接 left join 或者left outer join(等同于left join) [ left join 或者left outer join(等同于left join) ] [ where B.column is null ] right join 或者right outer…

Docker Registry本地镜像仓库部署并实现远程连接拉取镜像

Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…

Centos系列:shell编程综合练习(个人学习记录)

shell编程综合练习&#xff08;个人学习记录&#xff09; shell编程until 循环跳出循环1. break命令2. continue 命令 Shell函数特殊变量输入输出重定向输出重定向输入重定向重定向 Shell实战监控centos7运行状态/proc/stat文件编写脚本free命令监控系统内存 shell编程 until …