[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));
	}
}

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