【算法】【字符串】关联子串

news/2024/12/14 18:40:13/文章来源:https://www.cnblogs.com/kukuxjx/p/18607050

1  题目

给定两个字符串str1和str2,如果字符串str1中的字符,经过排列组合后的字符串中,只要有一个字符串是str2的子串,则认为str1是str2的关联子串。

若str1是str2的关联子串,请返回子串在str2的起始位置;

若不是关联子串,则返回-1。

输入描述:输入两个字符串,分别为题目中描述的str1、str2。

备注:输入的字符串只包含小写字母;两个字符串的长度范围[1, 100000]之间;

输出描述:

若str1是str2的关联子串,请返回子串在str2的起始位置;

若不是关联子串,则返回-1。

若str2中有多个str1的组合子串,请返回最小的起始位置。

示例 1:

abc efghicbaiii
5

示例2:

abc efghiccaiii
-1

2  解答

这道算法,我刚开始的时候我老想着 str1 的排列组合那么多,得到它所有的排列组合然后逐个判断是不是 str2 的子串,再从中选取一个最小的索引位置返回。但是所有的排列组合,那家伙字符串稍微长点那家伙量级岂不是很大貌似是 str1 长度的阶乘。所以我们换个角度去想,因为排列组合所以是任意的,但长度是固定的,我们是不是先分析下 str1 的组成比如是 a1b2c3d2 表示 a字符有1个、b字符2个、c字符3个、d字符2个,那么我们是不是在 str2 中每次取这样相等的长度,然后只要凑出这样的组成是不是就表示是关联子串了吧。我们用代码实现一下:

// 关联子串
public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 字符串1String str1 = "abc";// 字符串2String str2 = "efghiccaiii";// 默认返回结果int res = -1;int str1Len = str1.length();int str2Len = str2.length();// 边界判断if (str1Len > 0 && str1Len <= str2Len) {// 存储字符构成int[] arr = new int[26];// 先分析下 str1for (int i = 0; i < str1Len; i++) {int index = str1.charAt(i) - 'a';arr[index] += 1;}// str1 的组成StringBuilder str1Builder = new StringBuilder();for (int i = 0; i < arr.length; i++) {if (arr[i] > 0) {str1Builder.append((char)('a' + i) + "" + arr[i]);}}// 从 str2 每次遍历 str1 的长度出来 看看它的组成for (int i = 0; i < str2Len - str1Len; i++) {// 重置for (int j = 0; j < arr.length; j++) {arr[j] = 0;}// 分析子串组成for (int j = i; j < i + str1Len; j++) {int index = str2.charAt(j) - 'a';arr[index] += 1;}StringBuilder subBuilder = new StringBuilder();for (int j = 0; j < arr.length; j++) {if (arr[j] > 0) {subBuilder.append((char)('a' + j) + "" + arr[j]);}}// 判断是否组成跟 str1 的相等,相等直接返回并退出循环if (subBuilder.toString().equals(str1Builder.toString())) {res = i;break;}}// 打印结果
        System.out.println(res);}
}

这题挺好,又提供了一种思考的角度,与其大费周折的分析所有的排列组合,不如直接分析其组成,然后等长度的分析另一个字符串即可。

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

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

相关文章

随机中文字符生成-python包工具

随机生成中文文字,你指定数量这里介绍一个python工具包,随机生成中文文字,方便中文模型训练及随机中文字符串填充场景。操作如下: pip install chineserand代码示例: from chineserand import raw chinese_words = raw(10) print(chinese_words)项目开源地址: https://gi…

P6786 「SWTR-6」GCDs LCMs

有意思的推式子题一开始看到这个式子是不知所措的,推理出来的结论倒是挺有意思的,还是第一次遇到这样推理的。 一开始是打算直接枚举的,时间复杂度太高了,这个式子有什么意义呢? x+y+gcd(x,y) = lcm(x,y) x 等于 y时,显然不成立 当y>x时,这时候就需要猜了。x+y…

Muduo网络库解析---架构设计

前言 muduo库是陈硕个人开发基于reactor模式的tcp网络编程库。本人之前有学习过boost.asio网络库,故学习一下Muduo网络库,并分析它们之间的优缺点。 本系列将重点放在以下几件事情:梳理Muduo的核心架构设计以及各个模块的职责 理解Muduo的事件驱动机制 理解Muduo的多线程模型…

2024-2025-1学号20241309《计算机基础与程序设计》第十二周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十二周作业这个作业的目标作业正文 2024-2025-1学号20241309《计算机基础与程序设计》第十二周学习总结教材学习内容总结 《C语言程序设计》第十一章: 一…

四阶魔方教程

四阶魔方玩法还原教程 四阶魔方的还原其实很简单,大家不要看我画了这么多图,写了这么多字就以为好像很难,其实我是为了让大家尽可能的不费脑力就能学会才讲得尽量具体一点。 我们用的是降阶法,基本的还原过程如下:1.中心块复原2.棱的合并3.按三阶魔方还原4.特殊情况校正四…

P6599 「EZEC-2」异或

写数学时发现的好题 给出n和l,构造一个数组,数组长度为l,满足数组中的数字在 1-n 之间贪心的想,直接放n会发生什么。不难发现,最终的答案其实是两两异或之和 放一个n,答案就是1(l-1)n; 放一个n,答案就是2(l-2)n; 其实就是x(l-x)n; 还可以更大吗? n写成二进制就…

使用AOP防止请求重复提交

使用AOP防止请求重复提交首先定义注解NoPepeatSubmit@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NoRepeatSubmit {long value() default 1000*10; }定义AOP相关方法public class RepeatSubmitAspect {@Autowiredprivate StringRedisS…

三门峡知识付费系统服务热线

关于三门峡地区的知识付费系统及教育服务,虽然直接与三门峡地区的本地资源相关的信息比较有限,我们可以提供一些更宽广的信息和资源链接以帮助相关从业人员更好地了解知识付费系统和服务相关的背景信息与技术细节。例如,如果您在寻求构建或选择一个适合自身需求的知识付费系…

2024-2025-1 20241305《计算机基础与程序设计》第十二周学习总结

------------恢复内容开始------------ 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十二周作业这个作业的目标 指针和数组作业正文 本博客…

微信小程序商城构建全栈应用

D:\PanDownload\【微信小程序】\微信小程序商城构建全栈应用 第1章 前言:不同的时代,不同的Web 1-1 前言与导语 导语 好的课程需要包含俩方面: 一:整体的思路与编程思想(大局观,AOP ,10~20%) 二:具体的编程知识与技巧(TP5,小程序,数据库等80%) books+code 1-2 产品所使用的技…

龍兄虎弟 综艺 All In One

龍兄虎弟 综艺 All In One 主持人:張菲、費玉清龍兄虎弟 综艺 All In One主持人:張菲、費玉清精彩片段 https://www.youtube.com/watch?v=fD1MxE9e3Bg&list=PLtww_vcpAB8pJn3goLppo42EDqjt8t1kh完整版 https://www.youtube.com/watch?v=67MJj22yMp0&list=PLRWrniKO…

UWB物理层实现-特殊汉明码纠错

根据802.15.4协议,chapter15.2.7,PHR部分的编码,除了一些控制参数外,在后面添加了6位单错纠正双错检测码(SECDED),用于纠错能力的提升,这6位汉明码为PHR部分提供了至少1bit的纠错能力,以及至少2bit的检错能力。此码块由汉明码构成,与一般汉明码不同的是,改码并没有穿…