[LeetCode][3]Longest Substring Without Repeating Characters解析 -Java实现

来源:互联网 发布:苏州网络测试招聘 编辑:程序博客网 时间:2024/05/29 07:33

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

1 0
原创粉丝点击