Longest Substring Without Repeating Characters
Description
Given a string, find the length of the longest substring without repeating characters.
Example
Example 1:
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.
Solution
第一种方法,暴力破解法
public class Solution {
public static 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 (unique(s,i,j)){
ans = Math.max(ans,j-i);
}
}
}
return ans;
}
public static boolean unique(String s,int i,int j){
HashSet<Character> ss = new HashSet<>();
for (int k = i; k < j; k++) {
Character c = s.charAt(k);
if (ss.contains(c)){
return false;
}
ss.add(c);
}
return true;
}
public static void main(String[] args) {
String s1 = "abcabcbb";
String s2 = "bbbbb";
String s3 = "pwwkew";
System.out.println(lengthOfLongestSubString(s3));
}
}
时间复杂度O(n^2)
滑动窗口法
public static int lengthOfLongestSubString(String s) {
int n = s.length();
int ans = 0;
// 当前index
HashMap<Character, Integer> map = new HashMap<>();
// [i,j]窗口在这之间滑动
for (int i = 0, j = 0; j < n; j++) {
if (map.containsKey(s.charAt(j))){
i = Math.max(map.get(s.charAt(j)),i);
}
ans = Math.max(ans,j-i+1);
map.put(s.charAt(j),j+1);
}
return ans;
}