「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」。
由浅入深的解析最长子串长度的计算
题目描述
给定一个字符串s,请你找出其中不含有重复字符的 最长子串 的长度。
题目示例
题目解法
解法一:HashSet和List标识最长子串
内存消耗大、执行时间长。不推荐
/**
* 动态规划-HashSet && List
*/
class Solution {
public int lengthOfLongestSubstring(String s) {
// 判空返回
if(s == null || s.length() == 0){
return 0;
}
// 标识无重复字串
List<String> reBuildStr = new ArrayList<>();
// 存储当前无重复子串的长度
HashSet<Integer> reBuildHashSet = new HashSet<>();
for(int i = 0; i < s.length(); i++){
String curNum = String.valueOf(s.charAt(i));
if (reBuildStr.contains(curNum)) {
int index = reBuildStr.indexOf(curNum);
// 生成最新的无重复子串
reBuildStr = reBuildStr.subList(index + 1, reBuildStr.size());
}
reBuildStr.add(curNum);
reBuildHashSet.add(reBuildStr.size());
}
// 获取最长子串
return reBuildHashSet.stream().mapToInt(com->com).max().getAsInt();
}
}
解法二:双指针+List标识核算最大子串长度
较解法一,节省了内存空间的消耗
/**
* 双指针+List标识核算最大子串长度
*/
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() == 0){
return 0;
}
List<String> reBuildStr = new ArrayList<>();
int curMaxSize = 0;
int repeatIndex = -1;
int maxValue = 0;
for(int i = 0; i < s.length(); i++){
String curNum = String.valueOf(s.charAt(i));
if (reBuildStr.contains(curNum)) {
int lastIndex = reBuildStr.lastIndexOf(curNum);
if(lastIndex > repeatIndex){
curMaxSize = i - lastIndex -1;
repeatIndex = lastIndex;
}
}
reBuildStr.add(curNum);
curMaxSize++;
maxValue = Math.max(curMaxSize, maxValue);
}
return maxValue;
}
}
解法三:双指针+HashMap标识核算最大子串长度
较解法二,进一步提升了执行效率
/**
* 双指针+HashMap标识核算最大子串长度
*/
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
HashMap<Character, Integer> buildMap = new HashMap<>();
int maxLength = 0;
int leftIndex = 0;
for (int i = 0; i < s.length(); i++) {
char curChar = s.charAt(i);
if (buildMap.containsKey(curChar)) {
leftIndex = Math.max(leftIndex, buildMap.get(curChar) + 1);
}
buildMap.put(curChar, i);
maxLength = Math.max(maxLength, i - leftIndex + 1);
}
return maxLength;
}
}
LeetCode原题链接:leetcode-cn.com/problems/cl…