题目描述:
给定一个字符串,找出不含有重复字符的最长字串的长度。
实例:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:
Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
法1:暴力解决(Time Limit Exceeded)
public int lengthOfLongestSubstring(String s) {
int n=s.length();
int ans=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<=n;j++){
if(allUnique(s,i,j))
ans=Math.max(ans,j-i);
}
}
return ans;
}
public boolean allUnique(String s,int start ,int end){
Set<Character> set=new HashSet<>();
for(int i=start;i<end;i++){
Character ch=s.charAt(i);
if (set.contains(ch))
return false;
set.add(ch);
}
return true;
}
这种方法时间复杂度位O(n^3)会超出限制,不可取。
法2:滑动窗口
public int lengthOfLongestSubstring(String s) {
int n=s.length();
Set<Character> set=new HashSet<>();
int ans=0,i=0,j=0;
while(i<n&&j<n){
if(!set.contains(s.charAt(j))){
set.add(s.charAt(j++));
ans=Math.max(ans,j-i);
}else{
set.remove(s.charAt(i++));
}
}
return ans;
}
保存下ans的值,然后移除前面的字串,往后进行比较,最终取最大ans,即最大字串。
法3:优化滑动窗口
//优化滑动窗口
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int ans = 0;
Map<Character, Integer> map = new HashMap<>();
for (int i = 0, j = 0; i < n; i++) {
if (map.containsKey(s.charAt(i))) {
j = Math.max(map.get(s.charAt(i)), j);
}
ans = Math.max(ans, i - j + 1);
map.put(s.charAt(i), i + 1);
}
return ans;
}