力扣03 返回最大不重复子串的长度
题目:
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路:
对于数组或者字符串等找子串之类的题目多考虑使用“滑动模块”来做。滑动模块也可以称之为快慢指针法也就是说定义两个指针一个快指针一个慢指针,快指针先走慢指针后走当不满足快指针继续往前走的时候慢指针才开始走,当慢指针走到满足快指针继续往前走的时候慢指针停止往前走快指针继续往前走,这仅仅是快慢指针一种,本题就需要借鉴这样的思想。
代码:
import java.util.HashMap;
/**
* 返回字符串s中不含有重复字符的最大子串的长度
* 滑动窗口的方法也是快慢指针法
* 快慢指针也就是快指针先走当快指针走到不满足条件的时候慢指针就开始走,当慢指针走到符合快指针走的条件的时候快指针就又开始走
*/
public class MaxSubString01 {
//1.定义一个返回值类型为int类型的方法参数为String类型的字符串
public static int returnMaxSubString(String str){
/**
* 定义一个left用来标记慢指针走的位置点
* 定义一个right用来标记快指针走的位置点
* 定义一个maxLength用来存储目前最长子串的长度
* 定义一个hashmap用来存储字符以及该字符的下标
*/
char[] chars = str.toCharArray();
int left = 0;
int right = 0;
int maxLength = 0;
HashMap<Character, Integer> lastOccurrence = new HashMap<>();
//2.判断字符串str是否为空
if(str == null || str.isEmpty()){
return 0;
}
//3.快指针往前走
for (right = 0; right < chars.length; right++) {
char c = chars[right];
//3.1判定lastOccurrence中是否包含c
if(lastOccurrence.containsKey(c)){
//3.2如果包含c那么慢指针就要走到包含c的字符的下一个位置,因为要防止慢指针往回退所以要取之前的慢指针的位置与现在马上要移动到的位置的最大值
left = Math.max(left,lastOccurrence.get(c)+1);
//3.3更新maxLength的值
maxLength = Math.max(maxLength,right-left+1);
//3.4按理说还需要更新放进lastOccurrence的值
lastOccurrence.put(c,right);
}
//4.如果不包含就把当前字符放进lastOccurrence中
lastOccurrence.put(c,right);
//5.下面是一个公共的执行不管是否包含都要执行就是更新maxLength的值
maxLength = Math.max(maxLength,right-left+1);
}
return maxLength;
}
}
标签:子串,03,right,lastOccurrence,字符,力扣,maxLength,指针
From: https://www.cnblogs.com/ygstudy/p/16944221.html