java無重複字符的最長子串及優化思路

整體思路:

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來判斷大小。時間複雜度會更高

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章