整體思路:
1、新建一個集合來裝遍歷時候的字符串
2、遍歷字符串的時候判斷放入的集合中是否包含遍歷出來的字符串
3、如果包含,則判斷集合的大小就是無重複的子串長度,將大小保存,然後刪除集合中這個重複字符及重複
字符之間的字符。然後將新字符放入集合中。
4、如果不包含,則直接將字符放入集合中。
5、遍歷完全字符串之後,判斷當前最大長度和字符集合的大小,返回最大值的字符長度就可
例子
比如有字符串jrdrfgk
定義result爲不重複字符長度,
定義一個空集合來裝遍歷出來的字符
for循環遍歷,{
第一個字符是j,空集合中沒有字符,直接放入,此時集合中有字符j。
第二個字符是r,此時集合中不包含字符r,然後直接放入集合中,集合中有字符jr.
第三個字符是d,此時集合中不包含字符d,然後直接放入集合中,集合中有字符jrd.
第四個字符是r,此時集合中包含字符r,然後判斷集合長度3,賦值給result,此時result=3,然後刪除集合中的字符jr(即刪除r及r之前的字符),然後將字符r放入集合中,則字符集合爲dr.
第五個字符是f,此時集合中不包含字符f,然後直接放入集合中,集合中有字符drf.
第六個字符是g,此時集合中不包含字符g,然後直接放入集合中,集合中有字符drfg.
第七個字符是k,此時集合中不包含字符k,然後直接放入集合中,集合中有字符drfgk.
}
判斷result和集合大小的是那個大,然後將大的值賦值給result。
返回result即可。
優化
第一次是使用的List集合來裝的,list對於插入效率比較低。
第二次是使用LinkedList來裝的,便於插入和刪除,效率高,效率提高,運行速度提升,
代碼:
import java.util.ArrayList;
import java.util.List;
class Solution {
public int lengthOfLongestSubstring(String s) {
//第一種方法
// if (s.length() == 0){
// return 0;
// }
// if (s.trim().length() == 0) {
// return 1;
// }
// char[] chars= s.toCharArray();
// List list = new ArrayList();
// int result = 0;
// for (int i = 0; i < chars.length; i++ ) {
// if (list.contains(chars[i])) {
// if (result < list.size()) {
// result = list.size();
// }
// int end = list.indexOf(chars[i]);
// List childs = list.subList(0,end);
// list.removeAll(childs);
// list.remove(0);
// }
// list.add(chars[i]);
// }
// if (result < list.size()) {
// result = list.size();
// }
// return result;
// 2種方法
// if (s.length() == 0){
// return 0;
// }
// if (s.trim().length() == 0) {
// return 1;
// }
// char[] chars= s.toCharArray();
// LinkedList list = new LinkedList();
// int result = 0;
// for (int i = 0; i < chars.length; i++ ) {
// if (list.contains(chars[i])) {
// if (result < list.size()) {
// result = list.size();
// }
// while (chars[i] != list.removeFirst()){
// }
// }
// list.add(chars[i]);
// }
// if (result < list.size()) {
// result = list.size();
// }
// return result;
int length = s.length();
if (length == 0){
return 0;
}
if (s.trim().length() == 0) {
return 1;
}
LinkedList<Character> list = new LinkedList();
int result = 0;
for (int i = 0; i < length; i++ ) {
char str = s.charAt(i);
if (list.contains(str)) {
int size = list.size();
if (result < size) {
result = size;
}
while (str != list.removeFirst()){
}
}
list.addLast(str);
}
if (result < list.size()) {
result = list.size();
}
return result;
}
}
結尾
應該還可以使用使用Map來裝遍歷的字符串,
Map<Character,Integer>,其中key是字符,value作爲保存以key爲開頭的字符到出現key字符爲止的字符長度爲value,然後返回value中的最大值,但是需要多一次遍歷value來判斷大小。時間複雜度會更高