问题描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路
暴力解法
1.思路规划
遍历字符串,分别求取每个字符为首的最长无重复子串长度,其中最大值即为无重复字符的最长子串的长度。
2.代码实现
class Solution {
public int lengthOfLongestSubstring(String s) {
//创建哈希表用于判断字符是否重复
int[] d = new int[100];
//缓冲变量,用于记录子串长度
int temp1=0,temp2=0;
//对每一位字符查找其最长无重复字符串
for(int j=0;j<s.length();j++){
//对每一位字符查找其最长无重复字符串
for(int i=j;i<s.length();i++){
//哈希表记录字符出现次数
d[s.charAt(i)-' ']++;
//若字符重复出现即得到该位字符的最长无重复字符串
if(d[s.charAt(i)-' ']>1){
if(temp1>temp2){
//缓存最大无重复字符串长度
temp2=temp1;
}
//哈希表置为空
Arrays.fill(d,0);
temp1=0;
break;
}
temp1++;
}
}
//对于特殊情况进行处理,如字符串长度为一时
if(temp1>temp2)
temp2=temp1;
return temp2;
}
暴力解法优化-滚动窗口
1.思路规划
设相邻两位字符为s1,s2,则若以s2为起始的最大无重复字符串的末位必大于等于s1的末位。故可以在暴力解法的基础上增加一个右指针,用以记录末位,减少多余重复。
2.代码实现
class Solution {
public int lengthOfLongestSubstring(String s) {
int[] d = new int[100];
int temp=0;
//设置右指针
int right=0;
//遍历字符串
for(int i=0;i<s.length();i++){
//起始位一次子串遍历结束后,从哈希表中删除起始位
if(i!=0){
d[s.charAt(i-1)-' ']--;
}
//遍历找出最长无重复字符串并更新右指针
while(right<s.length()&&d[s.charAt(right)-' ']==0){
d[s.charAt(right)-' ']++;
right++;
}
//更新最长无重复子串长度
temp = Math.max(temp,right-i);
}
return temp;
}
}