🏆个人专栏
🤺 leetcode
🧗 Leetcode Prime
🏇 Golang20天教程
🚴♂️ Java问题收集园地
🌴 成长感悟
欢迎大家观看,不执着于追求顶峰,只享受探索过程
3. 最长无重复字符的子串
作为leetcode第三道题,类型是典型的String类型,都可以让我们联想到Two pointer, 暴力解法,就让我们看看这道题如何解答更好。
题目描述
给定一个字符串 s, 找到最长的没有重复的子串。
这题描述只有一句话,另外很直观是String类型题目,但是并没有简单题的直白,加了最长,没有重复的两个附加条件,可以看看是哪种方式更好解决。
这里我个人小白理解分析:
既然是为了面试,那我们不能让面试官久等了,我们一般可以考虑暴力算法。
第一步:面试官您好,我用的是循环遍历数组的方法,对于给定的字符串,从第一个字符开始,逐个向后遍历,维护一个集合来记录当前子串中出现过的字符。
第二步:如果当前字符已经出现在集合中,那么就将当前子串的长度更新为当前位置与集合中该字符出现位置的最小值,并将集合中该字符移除。
第三步:否则,将当前字符添加到集合中。重复该过程,直到遍历完字符串。最后返回集合中最大的子串长度。
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int maxLen = 0;
for (int i = 0; i < n; i++) {
Set<Character> set = new HashSet<>();
for (int j = i; j < n; j++) {
if (!set.contains(s.charAt(j))) {
set.add(s.charAt(j));
} else {
maxLen = Math.max(maxLen, j - i);
break;
}
}
}
return maxLen;
}
OK,完事儿,等着面试官来表扬自己吧。他肯定会说:小子,你是个好手!工位都给你准备好了,工资你说了算。
嘿嘿,可以请白月光吃烤肉了
面试官:嗯,你这个要是nums 数组 要是给了十万个数是不是会影响性能?
内心OS:今年这个找工市场,人言洛阳花似锦,偏我来时不逢春。。。怎的,技能要求突然涨了,不是做出来就行?
好吧,逼我拿出压箱底的东西是吧。的确这个算法是偏慢一些,但是这不是想着去请班花吃饭么。
public static int lengthOfLongestSubstring(String s) {
int n = s.length();
int longestLength = 0;
int left = 0;
Set<Character> seen = new HashSet<>();
for (int right = 0; right < n; right++) {
if (seen.contains(s.charAt(right))) {
while (s.charAt(left) != s.charAt(right)) {
seen.remove(s.charAt(left));
left++;
}
}
seen.add(s.charAt(right));
longestLength = Math.max(longestLength, right - left + 1);
}
return longestLength;
}
面试官满意的说:嗯,这才是我们想要的人才。好了,进入下一场吧!
============================================================================
🍀🍀🍀🍀🍀🍀更多算法题解请看 面试数据结构与算法总结分类+leetcode目录【基础版】
编码道路漫漫,只要先看脚下的路,徐徐前进即可。