【每日一练及解题思路V2】给定一个字符串,找出其中不含重复字符的最长子串的长度

本文主要是介绍【每日一练及解题思路V2】给定一个字符串,找出其中不含重复字符的最长子串的长度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【每日一练及解题思路V2】给定一个字符串,找出其中不含重复字符的最长子串的长度

一、题目:给定一个字符串,找出其中不含重复字符的最长子串的长度:

二、举例:

  • 比如"abcdefgh",不含重复字符的最长子串为eacdb,长度为8;
  • 比如"abceacdb",不含重复字符的最长子串为eacdb,长度为5;
  • 比如"aaaabcbb",不含重复字符的最长子串为abc,长度为3;
  • 比如"pwwkewww",不含重复字符的最长子串为wke或kew,长度为3;
  • 比如"bbbbbbbb",不含重复字符的最长子串为b,长度为1;
  • 比如"",不含重复字符的最长子串没有,长度为0

三、解析推导:

多读题!!! 从目标字符串中找到不含重复字符的最长子串的长度
多读题!!! 从目标字符串中找到不含重复字符的最长子串的长度
多读题!!! 从目标字符串中找到不含重复字符的最长子串的长度
解题思路示意图:
在这里插入图片描述

四、总结归纳:

从左到右遍历字符串的每个字符,找到每个字符所能组成的不包含重复字符的子串,然后比较这些子串的长度,取其中最大的那一个即是所要找的不含重复字符的最长子串。

五、示例代码

import java.util.HashMap;
import java.util.Map;
/*** 从左到右遍历每个字符,找到每个字符所能组成的不包含重复字符的子串,然后比较这些子串的长度,取其中最大的那一个即可。*/public class MaxLengthOfDistinctSubStr_V2 {/**获取字符串的不重复字符的最长子串的长度*/public static int getMaxLengthOfDistinctSubStr(String str) {		if(null==str || str.length()==0) {return 0;}Map<Character,Boolean> charCacheMap = new HashMap<Character, Boolean>();int len=0,end=0;for(int i=0; i<str.length();) {if(end == str.length()) {len = end-i>len?end-i:len;break;}char tmpChar = str.charAt(end);if(null!=charCacheMap.get(tmpChar)) {				len = end-i>len?end-i:len;				end = ++i;charCacheMap.clear();}else {charCacheMap.put(tmpChar, true);end++;}}return len;}public static void main(String[] args) {System.out.println("abcdefgh:" + getMaxLengthOfDistinctSubStr("abcdefgh"));System.out.println(":" + getMaxLengthOfDistinctSubStr(""));System.out.println("abceacdb:" + getMaxLengthOfDistinctSubStr("abceacdb"));System.out.println("aacabcbb:" + getMaxLengthOfDistinctSubStr("aacabcbb"));System.out.println("pwwkewww:" + getMaxLengthOfDistinctSubStr("pwwkewww"));System.out.println("bbbbbbbb:" + getMaxLengthOfDistinctSubStr("bbbbbbbb"));}
}

六、执行结果

在这里插入图片描述

七、与V1解题过程比较

  • V1更偏向于暴力破解,而V2更优雅,只需要遍历一次即可,还是画示意图更能理清思路,一目了然~

这篇关于【每日一练及解题思路V2】给定一个字符串,找出其中不含重复字符的最长子串的长度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.