给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路:
最简单直接的就是暴力法了:求出所有的子串,复杂度为O(n ^ 2)。再判断里面有没有重复的字符,复杂度为O(n ),取出最长的长度,总的时间复杂度为O(n ^ 3)。
其实两边都可以优化,用双指针优化求所有子串的过程,复杂度为O(2n ),判断的过程也可以用set集合在双指针移动的时候同时进行判断,复杂度为O(1),这样子就可以把原来的O(n ^ 3)级别降成O(n )了。
代码:
class Solution
{
public int lengthOfLongestSubstring(String s)
{
if(s==null||s.equals(""))
return 0;
Set<Character> set=new HashSet<Character>();
int l=0,r=0;
int ans=1;
while(r<s.length())
{
if(set.contains(s.charAt(r)))
{
set.remove(s.charAt(l));
ans=Math.max(ans, r-l);
l++;
}
else
{
set.add(s.charAt(r));
r++;
}
}
ans=Math.max(ans, r-l);
return ans;
}
}