LeetCode 链接 : https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/description/
题目: 无重复字符的最长子串
给定一个字符串,找出不含有重复字符的 最长子串 的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
第一次做只能实现"暴力"解决,时间复杂度是最糟糕的O(n^3).参考社区提供后,学会了时间复杂度的O(n)的解法.
class Solution {
public int lengthOfLongestSubstring(String s) {
//返回值,最长子字符串
int result = 0 ;
//索引号
int index = 0 ;
//记录键值对
Map<Character , Integer> map = new HashMap();
//两个相同字符之间的距离
int mark = 0 ;
//字符串的长度
int stringLeng = s.length();
//遍历字符串
while(stringLeng != index )
{
//取出每个字符串的字符
char c = s.charAt(index) ;
//字符重复出现
if( map.containsKey( c )) {
两个相同字符之间的距离
mark = Math.max(mark , map.get( c ));
}
//最长子字符串, "+1"和下一条语句的"++index"是防止字符串s长度为1的情况.
maxLength = Math.max(result , index - mark + 1);
//放入键值对
map.put(c , ++index);
}
return result ;
}
}