3. 无重复字符的最长子串
题目描述
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
分析:滑动窗口,int[] m = new int[256]创建256大小的整型数组储存256个ASCII字符,res表示最长无重复子串的长度,left表示无重复子串左窗口下标,遍历字符串并移动左窗口,i - left +1计算最长无重复子串,i表示最长无重复子串最右边的位置,left表示最左边的位置,以字符串"abcabcbb"为例:
i=0 s.charAt(i)=a m[s.charAt(i)]=0 left=0 res=1
i=1 s.charAt(i)=b m[s.charAt(i)]=0 left=0 res=2
i=2 s.charAt(i)=c m[s.charAt(i)]=0 left=0 res=3
i=3 s.charAt(i)=a m[s.charAt(i)]=1 left=1 res=3
i=4 s.charAt(i)=b m[s.charAt(i)]=2 left=2 res=3
i=5 s.charAt(i)=c m[s.charAt(i)]=3 left=3 res=3
i=6 s.charAt(i)=b m[s.charAt(i)]=5 left=5 res=3
i=7 s.charAt(i)=b m[s.charAt(i)]=7 left=7 res=3
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
int[] arr = new int[256];
int res = 0, left = 0;
for (int i = 0; i < s.length(); i++) {
left = Math.max(left, arr[s.charAt(i)]);
res = Math.max(res, i - left + 1);
arr[s.charAt(i)] = i + 1;
}
return res;
}
}
法二:通过HashMap<Character, Integer>存储对应字符所处的下标,res表示最长无重复子串的长度,left表示无重复子串左窗口下标,遍历字符串,如果map包含该字符,则修改左窗口下标为Max[左窗口下标,字符下标+1],例如:abca =>[0,0+1],left修改为1,并更新map中a字符对应的下标为3,i - left +1计算最长无重复子串。
public class Solution {
public static int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
HashMap<Character, Integer> map = new HashMap<>();
int res = 0, left = 0;
for (int i = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
left = Math.max(left, map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i);
res = Math.max(res, i - left + 1);
}
return res;
}
}