明确题意:
给一个字符串,返回该字符串不含重复字符的最长子串的长度。
- 不含重复字符:子串内不能有相同的字符。
- 子串:字符是连续的。
解题思路:
方式一:暴力求解
- 逐个生成子字符串
- 看它是否不含有重复的字符
方式二:滑动窗口
什么是滑动窗口?参考下图
i表示左指针,j表示右指针。不断移动右指针,将右指针指向的字符不断加入窗口,直至窗口遇到重复字符。就调整左指针。子串的长度就是j-i+1,所以滑动窗口可以用队列来实现,也可以用其他数据结构来实现。
public int lengthOfLongestSubstring(String s) {
//判空
if (s == null || s.length() == 0) {
return 0;
}
//哈希集合,记录每个字符是否出现过
Set<Character> occ = new HashSet<Character>();
int n = s.length();
//右指针,初始值为-1,相当于在字符串的左侧,还未开始移动
int rk = -1, ans = 0;
for (int i = 0; i < n; ++i) {
if (i != 0) {
//左指针向右移动一格,移除一个字符
occ.remove(s.charAt(i - 1));
}
while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
//不断移动右指针
occ.add(s.charAt(rk + 1));
++rk;
}
//第i到rk个字符是一个极长的无重复字符字串
ans = Math.max(ans, rk - i + 1);
}
return ans;
}