题目
给定一个字符串 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 由英文字母、数字、符号和空格组成
链接:3. 无反复字符的最长子串
思路
- 通过头尾指针来标出以后"无反复字符"
- 一旦呈现反复,则挪动头指针。
- 通过"尾指针地位-头指针地位"失去"无反复字符"长度。
如下图
代码
public int lengthOfLongestSubstring(String s) { if(s == null || s.length() == 0) { return 0; } int n = s.length(); int ret = 0; // 反复字符串呈现的地位 int point; // 以后"无反复字符"的起始地位 int begin = 0; for (int i = 0; i < n; ++i) { // 获取反复字符呈现的地位 point = s.indexOf(s.charAt(i), begin); // 如果大于1,则阐明以后"无反复字符"里没有反复 point = point >= i ? -1 : point; if (point >= 0) { ret = Math.max(ret, i - begin); // "无反复字符"的其实地位往右挪动一位 begin = point + 1; } } return Math.max(ret, n - begin);}
运行后果: