题目描述(题目链接)
求解思路1
滑动窗口(可参考leetcode官方题解)
i指针指向窗口的左边,j指针指向窗口的右边。用HashSet存储无重复的子串。
若j指向的字符和当前HashSet无重复,则加入,j右移
若重复,i要右移到无重复的位置,同时舍弃掉重复字符之前的。
代码1
执行用时:7 ms, 在所有 Java 提交中击败了79.41%的用户
内存消耗:38.5 MB, 在所有 Java 提交中击败了75.10%的用户
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
HashSet<Character> subs = new HashSet<Character>();
int j = 0;
int ans = 0;
for(int i=0;i<n;i++){
if(i!=0){
subs.remove(s.charAt(i-1));
}
while(j<n && !subs.contains(s.charAt(j))){
subs.add(s.charAt(j));
j++;
}
// System.out.println(subs);
ans = Math.max(ans,subs.size());
}
return ans;
}
}
求解思路2
动态规划
代码2
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
if(n==0){
return 0;
}
int[] dp = new int[n]; //动态规划数组
dp[0] = 1;
for(int i=1;i<n;i++){
int flag = -1;
for(int j=i-1;j>i-1-dp[i-1];j--){ //检查一下s[i]和dp[i-1]里包含的字符有无重复
if(s.charAt(i)==s.charAt(j)){
flag = j;
break;
}
}
if(flag==-1){ //无重复
dp[i] = dp[i-1]+1;
}else{ //有重复
dp[i] = i-flag;
}
}
int result = 0;
for(int i=0;i<n;i++){
System.out.print(dp[i]);
if(dp[i]>result){
result = dp[i];
}
}
return result;
}
}