题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路一:暴力法。两层for循环,外层确定起始角标,内层for循环确定结束角标。使用变量保存最大角标即可。
解题思路二:滑动窗口(推荐)。使用start,end指针指向字符串首尾,若未出现重复字符,end++;若出现重复字符,start++;判断字符串中是否含有字符,可以使用hashSet,复杂度低。
滑动窗口动态图如下:
代码如下:
public static int lengthOfLongestSubstring1(String s)
{
/**
*
* 功能描述: 滑动窗口
*
* @param: [s]
* @return: int
* @auther: Mr. Wang
* @date: 2020/7/31 23:16
*/
int start = 0,end = 0;
int len = s.length();
int result=0;
HashSet<Character> hashSet = new HashSet<>();
while(start<len&&end<len)
{
if (hashSet.contains(s.charAt(end)))
{
hashSet.remove(s.charAt(start));
start++;
}else
{
hashSet.add(s.charAt(end));
end++;
result=Math.max(result, end-start);
}
}
return result;
}
/**
*
* 功能描述: 暴力法
*
* @param: [s]
* @return: int
* @auther: Mr. Wang
* @date: 2020/7/31 23:16
*/
private static int lengthOfLongestSubstring(String s) {
if (s.length() == 0)
return 0;
int max = 0;
String s1 = "";
for (int i = 0; i < s.length(); i++) {
s1 = s.charAt(i)+"";
for (int j = i+1; j < s.length(); j++) {
String temp =s.charAt(j)+"";
if (!s1.contains(temp))
{
s1+=temp;
}
else {
break;
}
}
if (s1.length()>max)
{
max = s1.length();
}
}
return max;
}