LeetCode No3 无重复字符的最长子串
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
思路
题目只需要求出不含有重复字符的最长子串的长度,只需要求长度的话就简单了,利用双指针的思想,先定义一个字符set,保存当前子串的所有字符,定义一个最长子串的开始坐标back,再定义一个最长子串的结束坐标front,最长字串长度max=Math.max(max, front-back+1) , 然后使用front遍历字符串,如果set里面没有包含当前遍历到的字符,则说明当前字符和之前的都不一样,直接front++,而如果set里面包含当前遍历到的字符,则说明之前有一样的字符,这个时候就需要将back移动至上一个同样的字符所在的坐标。
AC代码
点击查看代码
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> chars = new HashSet<Character>();
int back = 0;
int front = 0;
int max = 0;
while(front < s.length()) {
char currentChar = s.charAt(front);
if (!chars.contains(currentChar)) {
chars.add(currentChar);
int tmpMax = front - back + 1;
if (tmpMax > max) {
max = tmpMax;
}
} else {
char backChar = s.charAt(back);
while(backChar != currentChar) {
chars.remove(backChar);
++back;
backChar = s.charAt(back);
}
++back;
}
++front;
}
return max;
}
}
低调做人,高调做事。