1. question:无重复字符的最长子串(中等)
question: 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
示例 1:
1 2 3
| 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
|
示例 2:
1 2 3
| 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
|
示例 3:
1 2 3 4
| 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
|
提示:
1 2
| 0 <= s.length <= 5 * 104 s 由英文字母、数字、符号和空格组成
|
2. answers
思路:
这道题涉及到子串长度,可以采用双指针的方法来做。
无限不重复子串,首先要保留一个指针,用于遍历字符串;另外需要一个指针,保存当前子串的下标,当出现重复字符的时候,即代表子串结束,计算当前子串的长度。
比较之前保存的最长长度和当前子串的长度,取最大值保存。更新新子串的起始下标,继续遍历直到结束。
注意,新子串的起始下标:
- 必须是当前 最新 重复字符的后面的字符;
代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| public class Solution_0003 {
public static int lengthOfLongestSubstring(String s) {
char[] chars = s.toCharArray();
int answer = 0; int tempStart = 0;
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
if(map.containsKey(chars[i])){
answer = Math.max(answer, i - tempStart);
tempStart = Math.max(map.get(chars[i]) + 1, tempStart);
}
map.put(chars[i], i);
}
answer = Math.max(answer, s.length() - tempStart);
return answer; }
public static void main(String[] args) {
String s = "abba";
int subLength = lengthOfLongestSubstring(s); System.out.println(subLength);
} }
|
3. 备注
参考力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com)。