使用队列实现
队列是先进先出的,先判断队列中是否有当前字符,如果有,队头出队,知道队列中没有重复元素,并将每次队列中的元素存在一个变量中,如果大于之前的值,就赋值给变量,最后,判断变量和队列长度,大的即为无重复字符的最长子串。
public class lengthOfLongestSubstring {
/**
* 找出一个字符串中最长的没有重复元素的字串,返回子串长度
*/
public static void main(String[] args) {
String s = "gdshjdghhsdbd";
Queue<Character> queue=new LinkedList<>();
int max=0;
for (char c:s.toCharArray()){
while(queue.contains(c)){
queue.poll();
}
queue.add(c);
max=Math.max(queue.size(),max);
}
System.out.println(max);
}
}
暴力过了头,三重循环,自己都看懵了
String b = "abcabcbb";
int max=1;
char[] a = b.toCharArray();
int n = a.length;
for (int i=0;i<n;i++) {
xunhuan:for (int j = i + 1; j < n; j++) {
for (int m=i;m<j;m++){
if (a[m]==a[j]){
break xunhuan;
}
}
max=Math.max(j-i+1,max);
}
}
System.out.println(max);
}
}
滑窗法
String s = "jdj";
int n = s.length(), max = 0;
Map<Character, Integer> map = new HashMap<>();
for (int end = 0, start = 0; end < n; end++) {
char alpha = s.charAt(end);
if (map.containsKey(alpha)) {
start = Math.max(map.get(alpha), start);
}
max = Math.max(max, end - start + 1);
map.put(s.charAt(end), end + 1);
}
System.out.println(max);
}
}