【算法每日一练及解题思路】找出模式匹配字符串的异位词在原始字符串中出现的索引下标

本文主要是介绍【算法每日一练及解题思路】找出模式匹配字符串的异位词在原始字符串中出现的索引下标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【算法每日一练及解题思路】找出模式匹配字符串的异位词在原始字符串中出现的索引下标

一、题目:找出模式匹配字符串的异位词在原始字符串中出现的索引下标

二、举例:

两个字符串原始字符串initStr=123sf3rtfb,模式匹配字符串regx=f3s,找到模式匹配字符串regx(regx的异位词为f3s,fs3,3fs,3sf,sf3,s3f)在原始字符串initStr的索引下标2(对应3fs)和3(对应sf3)

三、思路:

解题思路:通过滑动时间窗口在原始字符串中找出长度匹配的子串,再去跟模式匹配字符串比较判断是否为其异位词

四、总结:

通过滑动时间窗口在原始字符串中找出长度匹配的子串,再去跟模式匹配字符串比较判断是否为其异位词

五、代码

import java.util.Scanner;/* @author Dylaniou* @date 20240831* @desc 找出模式匹配字符串的异位词在原始字符串中出现的索引下标*  两个字符串原始字符串initStr=123sf3rtfb,模式匹配字符串regx=f3s,找到模式匹配字符串regx(regx的异位字符,regx的异位词为f3s,fs3,3fs,3sf,sf3,s3f)在原始字符串initStr的索引下标2(对应3fs)和3(对应sf3)*/
public class IdentifyAnagram {public static void main(String[] args) {try(Scanner scanner = new Scanner(System.in);){String str = "" ;if(!str.equals("end")){System.out.print("请输入原始字符串内容:");str = scanner.nextLine();String initStr = str;System.out.print("请输入模式匹配字符串内容:");str = scanner.nextLine();String regx = str;getAnagramIndex(initStr,regx);}}}/** 获取指定字符串对应的异位词在原始字符串中出现的下标*/public static void getAnagramIndex(String initStr,String regx){//使用滑动时间窗口,从左到右依次遍历,窗口长度达到指定字符串长度则开始比较是否为异位词,//窗口左边界应从原始字符串左侧第一个字母逐个滑动过去,//每个滑动窗口的长度均为指定字符串的长度,//当窗口右边界达到原始字符串最后一个字符则终止滑动int left = 0;int right = 0;int windowSize = regx.length();while(right < initStr.length()){if((right-left)+1 == windowSize){String tmpStr = initStr.substring(left, right+1);if(isAnagram(tmpStr, regx)){System.out.println(left+":"+tmpStr);}right = ++left;}else{right++;}}}/** 判断两个字符串是否互为异位词:两个字符串中每个字符出现的次数均相同则说明互为异位词*/public static boolean isAnagram(String a,String b){if(a.length() != b.length()){return false;}int[] charCounts = new int[256];//假设只处理数字字母的组合;for(int i = 0; i < a.length(); i++){charCounts[a.charAt(i)]++;//a字符串中某字符出现一次则对应索引下标计数加1charCounts[b.charAt(i)]--;//b字符串中某字符出现一次则对应索引下标计数减1}for(int count:charCounts){if(count!=0){//如果互为异位词则每个字符在charCounts中的索引下标的计数应该都是0(因为一加一减相互抵消了)return false;}}return true;}
}

六、结果

在这里插入图片描述

这篇关于【算法每日一练及解题思路】找出模式匹配字符串的异位词在原始字符串中出现的索引下标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126325

相关文章

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

Elasticsearch 的索引管理与映射配置实战指南

《Elasticsearch的索引管理与映射配置实战指南》在本文中,我们深入探讨了Elasticsearch中索引与映射的基本概念及其重要性,通过详细的操作示例,我们了解了如何创建、更新和删除索引,... 目录一、索引操作(一)创建索引(二)删除索引(三)关闭索引(四)打开索引(五)索引别名二、映射操作(一

MySQL索引踩坑合集从入门到精通

《MySQL索引踩坑合集从入门到精通》本文详细介绍了MySQL索引的使用,包括索引的类型、创建、使用、优化技巧及最佳实践,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录mysql索引完整教程:从入门到入土(附实战踩坑指南)一、索引是什么?为什么需要它?1.1 什么

Mysql数据库聚簇索引与非聚簇索引举例详解

《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

一文详解MySQL索引(六张图彻底搞懂)

《一文详解MySQL索引(六张图彻底搞懂)》MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度,:本文主要介绍MySQL索引的相关资料,文中通过代码介绍的... 目录一、什么是索引?为什么需要索引?二、索引该用哪种数据结构?1. 哈希表2. 跳表3. 二叉排序树4.

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su