[LeetCode][3]Longest Substring Without Repeating Characters解析 -Java實現

A:

Given a string, find the length of the longest substring without repeating characters.

Q:

以下解法和代碼沒有借閱以往任何資料,如果有更好的解法請在評論區留言

大致意思就是給你一個字符串,找出裏面最長的不重複的字符串。反正我的第一反應如下(靈感來源於Android源碼中對雙擊,三擊的判斷)

1、創建一個link和一個storelink

2、每遇到一個字母都對比上一個如果不一樣就存入link,直到一樣,把link存入storelink,然後重複步驟2(需要對比link和storelink,長的留下,短的刪掉,類似於排序)

3、字符串結束,找出兩個array中長的那個。

仔細想後還有一個辦法,就是模擬正則的過程

1、遍歷字符數組,找出相同的字母用單個字幕替換記錄下位置

1、新建一個字符串,如果下一個字符和上一個一樣則不接在新字符串上並且記錄位置,如果不一樣則接上

  2、返回新字符串

2、對比長度,找出最常

3、截取返回

我們對比兩個辦法第一個辦法需要兩個鏈表(link)和一個原本的字符串而方法2只需要兩個字符串

方法1需要每次相同字母對比還需要兩個link對比方法2只需要字母對比,但是最後還是需要長度對比

那麼我們知道對比肯定是要有一次在相同字母上,一次在長度上,我們也沒辦法減了(有的話請告訴我),只能在空間上減縮,方法2如下(原本有寫一個更節儉空間的,但是那個代碼太長了,提供思路:記錄字符串不重複的起始位置和結束位置,可以節省一個字符串)

代碼如下

public class LongestSubstringWithoutRepeatingCharacters {
	public static void main(String[] args){
		String a = "assssdffdsafssdg";
		System.out.println(method(a));
	}
	public static String method(String s){
		String noRepate = "";
		boolean flag = true;//是不是第一次重複
		char lastChar = ' ';
		char[] array = s.toCharArray();
		LinkedList interval = new LinkedList();
		interval.addLast(0);
		for(int i = 0 ; i<array.length;i++){
			if(lastChar!=array[i]){//不重複
				lastChar = array[i];
				noRepate+=array[i];
				flag = true;
			}else{//重複了
				if(flag){
					flag = false;
					interval.addLast(i);
				}
			}
		}
		interval.addLast(array.length-1);
		int maxInterval = 0;
		int position = 0;
		for(int i = 1;i<interval.size();i++){
			int inter = (int)interval.get(i)-(int)interval.get(i-1);
			if(inter>maxInterval){
				maxInterval = inter;
				position = i;
			}
		}
		return s.substring((int)interval.get(position-1),(int)interval.get(position));
	}
}

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