Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 查找不重复字符的最长子字符串_String_Algorithm - Fatal编程技术网

String 查找不重复字符的最长子字符串

String 查找不重复字符的最长子字符串,string,algorithm,String,Algorithm,给定长度为N的字符串S,查找不重复字符的最长子字符串 示例: 输入:“堆栈溢出” 输出:“堆栈溢出” 如果有两个这样的候选人,首先从左边返回。我需要线性时间和常数空间算法 您将需要一个开始和结束定位器(/指针)用于 字符串和存储每个字符信息的数组: 至少发生过一次吗 从字符串的开头开始,两个定位器都指向 字符串的开头 将端点定位器向右移动,直到找到为止 重复(或到达字符串的末尾)。对于每个已处理的字符,将其存储在数组中。 停止时,如果这是最大的子字符串,则存储位置。还要记住重复的字符 现在在处理

给定长度为N的
字符串S
,查找不重复字符的最长子字符串

示例:

输入:“堆栈溢出”

输出:“堆栈溢出”

如果有两个这样的候选人,首先从左边返回。我需要线性时间和常数空间算法

  • 您将需要一个开始和结束定位器(/指针)用于 字符串和存储每个字符信息的数组: 至少发生过一次吗

  • 从字符串的开头开始,两个定位器都指向 字符串的开头

  • 将端点定位器向右移动,直到找到为止 重复(或到达字符串的末尾)。对于每个已处理的字符,将其存储在数组中。 停止时,如果这是最大的子字符串,则存储位置。还要记住重复的字符

  • 现在在处理时对开始定位器执行相同的操作 每个字符从数组中删除其标志。移动定位器直到 您可以找到重复字符的较早出现

  • 如果尚未到达字符串的末尾,请返回步骤3


  • 总体:O(N)

    保留一个数组,指示某个字符最后出现的位置。为方便起见,所有字符都出现在位置-1。您在保留窗口的字符串上进行迭代,如果某个字符在该窗口中重复,您将删除以该字符第一次出现结尾的前缀。始终保持最长的长度。下面是一个python实现:

    def longest_unique_substr(S):
      # This should be replaced by an array (size = alphabet size).
      last_occurrence = {} 
      longest_len_so_far = 0
      longest_pos_so_far = 0
      curr_starting_pos = 0
      curr_length = 0
    
      for k, c in enumerate(S):
        l = last_occurrence.get(c, -1)
        # If no repetition within window, no problems.
        if l < curr_starting_pos: 
            curr_length += 1
        else:
            # Check if it is the longest so far
            if curr_length > longest_len_so_far: 
                longest_pos_so_far = curr_starting_pos
                longest_len_so_far = curr_length
            # Cut the prefix that has repetition
            curr_length -= l - curr_starting_pos
            curr_starting_pos = l + 1
        # In any case, update last_occurrence
        last_occurrence[c] = k
    
      # Maybe the longest substring is a suffix
      if curr_length > longest_len_so_far:
        longest_pos_so_far = curr_starting_pos
        longest_len_so_far = curr_length
    
      return S[longest_pos_so_far:longest_pos_so_far + longest_len_so_far]
    
    def longest_unique_substr(S):
    #这应该由数组(大小=字母表大小)替换。
    最后一次出现={}
    迄今为止最长的长度=0
    迄今为止最长位置=0
    当前起始位置=0
    当前长度=0
    对于枚举中的k,c:
    l=最后一次出现。获取(c,-1)
    #如果窗口内没有重复,则没有问题。
    如果l迄今为止最长长度:
    最长位置到目前为止=当前开始位置
    最长长度=当前长度
    #剪切有重复的前缀
    当前长度-=l-当前起始位置
    当前启动位置=l+1
    #在任何情况下,都要更新上次发生的事件
    最后一次出现[c]=k
    #也许最长的子字符串是后缀
    如果当前长度>迄今为止最长长度:
    最长位置到目前为止=当前开始位置
    最长长度=当前长度
    返回S[最长位置到目前为止:最长位置到目前为止+最长长度到目前为止]
    
    编辑:

    以下是concesus的一个实现。这件事是在我最初出版之后发生的。为避免删除原件,现将其提交如下:

    public static String longestUniqueString(String S) {
        int start = 0, end = 0, length = 0;
        boolean bits[] = new boolean[256];
        int x = 0, y = 0;
        for (; x < S.length() && y < S.length() && length < S.length() - x; x++) {
            bits[S.charAt(x)] = true;
            for (y++; y < S.length() && !bits[S.charAt(y)]; y++) {
                bits[S.charAt(y)] = true;
            }
            if (length < y - x) {
                start = x;
                end = y;
                length = y - x;
            }
            while(y<S.length() && x<y && S.charAt(x) != S.charAt(y))
                bits[S.charAt(x++)]=false;
        }
        return S.substring(start, end);
    }//
    
    公共静态字符串longestUniqueString(字符串S){
    int开始=0,结束=0,长度=0;
    布尔位[]=新布尔值[256];
    int x=0,y=0;
    对于(;x私有静态字符串LongestSubstring(字符串字)
    {
    var set=新的HashSet();
    字符串longestOverAll=“”;
    字符串longestILNOW=“”;
    foreach(word中的字符c)
    {
    如果(!set.Contains(c))
    {
    longestTillNow+=c;
    增加(c);
    }
    其他的
    {
    longestTillNow=string.Empty;
    }
    if(longestILNOW.Length>longestOverAll.Length)
    {
    longestOverAll=最长到现在;
    }
    }
    总回报率;
    }
    
    JavaScript中的算法(带有大量注释)

    /**
    给定一个字符串,S查找不重复字符的最长子字符串。
    例子:
    输入:“堆栈溢出”
    输出:“StackOverv”
    输入:“stackoverflowabcdefghijklmn”
    输出:“owabcdefghijklmn”
    */
    函数findLongestNonRepeatingSubStr(输入){
    var chars=输入。拆分(“”);
    var-currChar;
    var str=“”;
    var longestStr=“”;
    var hash={};
    对于(变量i=0;i我们可以逐个考虑所有子串,并检查每个子串是否包含所有唯一字符。
    将有n*(n+1)/2个子字符串。子字符串是否包含所有唯一字符可以通过线性时间检查
    从左到右扫描并保留访问字符的地图。此解决方案的时间复杂度为O(n^3)`

    import java.util.ArrayList;
    导入java.util.Collections;
    导入java.util.HashMap;
    导入java.util.LinkedHashSet;
    导入java.util.List;
    导入java.util.Map;
    导入java.util.Set;
    不带重复字符的公共类lengthoflongestsubstring{
    公共静态void main(字符串[]args)
    {
    字符串s=“stackoverflow”;
    //所有子串;
    System.out.println(“查找结果”+find(s));
    }
    公共静态字符串查找(字符串s)
    {
    列出所有子字符串=所有子字符串;
    Set main=new LinkedHashSet();
    用于(字符串温度:AllSubString)
    {
    布尔值a=假;
    对于(int i=0;ii;k--)
    {
    如果(温度特性(k)=温度特性(i))
    a=真;
    }
    }
    如果(!a)
    {
    主。添加(温度);
    }
    }
    /*用于(字符串x:main)
    {
    
    public static String longestUniqueString(String S) {
        int start=0, end=0, length=0;
        boolean bits[] = new boolean[256];
        int x=0, y=0;
        for(;x<S.length() && y<S.length() && length < S.length()-x;x++) {
            Arrays.fill(bits, false);
            bits[S.charAt(x)]=true;
            for(y=x+1;y<S.length() && !bits[S.charAt(y)];y++) {
                bits[S.charAt(y)]=true;
            }           
            if(length<y-x) {
                start=x;
                end=y;
                length=y-x;
            }
        }
        return S.substring(start,end);
    }//
    
    public static void main(String... args) {
        String input[][] = { { "" }, { "a" }, { "ab" }, { "aab" }, { "abb" },
                { "aabc" }, { "abbc" }, { "aabbccdefgbc" },
                { "abcdeafghicabcdefghijklmnop" },
                { "abcdeafghicabcdefghijklmnopqrabcdx" },
                { "zxxaabcdeafghicabcdefghijklmnopqrabcdx" },
                {"aaabcdefgaaa"}};
        for (String[] a : input) {
            System.out.format("%s  *** GIVES ***  {%s}%n", Arrays.toString(a),
                    longestUniqueString(a[0]));
        }
    }
    
    private static string LongestSubstring(string word)
            {
                var set = new HashSet<char>();
                string longestOverAll = "";
                string longestTillNow = "";
    
                foreach (char c in word)
                {
                    if (!set.Contains(c))
                    {
                        longestTillNow += c;
                        set.Add(c);
                    }
                    else
                    {
                        longestTillNow = string.Empty;
                    }
    
                    if (longestTillNow.Length > longestOverAll.Length)
                    {
                        longestOverAll = longestTillNow;
                    }
                }
    
                return longestOverAll;
            }
    
    /**
     Given a string S find longest substring without repeating characters.
     Example:
    
     Input: "stackoverflow"
     Output: "stackoverfl"
    
     Input: "stackoverflowabcdefghijklmn"
     Output: "owabcdefghijklmn"
     */
    function findLongestNonRepeatingSubStr(input) {
        var chars = input.split('');
        var currChar;
        var str = "";
        var longestStr = "";
        var hash = {};
        for (var i = 0; i < chars.length; i++) {
            currChar = chars[i];
            if (!hash[chars[i]]) { // if hash doesn't have the char,
                str += currChar; //add it to str
            hash[chars[i]] = {index:i};//store the index of the char
        } else {// if a duplicate char found..
            //store the current longest non-repeating chars. until now
            //In case of equal-length, <= right-most str, < will result in left most str
            if(longestStr.length <= str.length) {
                longestStr = str;
            }
            //Get the previous duplicate char's index
            var prevDupeIndex = hash[currChar].index;
    
            //Find all the chars AFTER previous duplicate char and current one
            var strFromPrevDupe = input.substring(prevDupeIndex + 1, i);
            //*NEW* longest string will be chars AFTER prevDupe till current char
            str = strFromPrevDupe + currChar;
            //console.log(str);
            //Also, Reset hash to letters AFTER duplicate letter till current char
            hash = {};
            for (var j = prevDupeIndex + 1; j <= i; j++) {
                hash[input.charAt(j)] = {index:j};
            }
        }
      }
      return longestStr.length > str.length ? longestStr : str;
    }
    
    //console.log("stackoverflow => " + findLongestNonRepeatingSubStr("stackoverflow"));      
    //returns stackoverfl
    
    //console.log("stackoverflowabcdefghijklmn => " + 
    findLongestNonRepeatingSubStr("stackoverflowabcdefghijklmn")); //returns owabcdefghijklmn
    
    //console.log("1230123450101 => " + findLongestNonRepeatingSubStr("1230123450101")); //    
    returns 234501
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.LinkedHashSet;
    import java.util.List;
    import java.util.Set;
    import java.util.TreeMap;
    
    public class LongestSubString2 {
    
        public static void main(String[] args) {
            String input = "stackoverflowabcdefghijklmn";
            List<String> allOutPuts = new ArrayList<String>();
            TreeMap<Integer, Set> map = new TreeMap<Integer, Set>();
            for (int k = 0; k < input.length(); k++) {
                String input1 = input.substring(k);
                String longestSubString = getLongestSubString(input1);
                allOutPuts.add(longestSubString);
            }
    
            for (String str : allOutPuts) {
                int strLen = str.length();
                if (map.containsKey(strLen)) {
                    Set set2 = (HashSet) map.get(strLen);
                    set2.add(str);
                    map.put(strLen, set2);
                } else {
                    Set set1 = new HashSet();
                    set1.add(str);
                    map.put(strLen, set1);
                }
    
            }
            System.out.println(map.lastKey());
            System.out.println(map.get(map.lastKey()));
        }
    
        private static void printArray(Object[] currentObjArr) {
            for (Object obj : currentObjArr) {
                char str = (char) obj;
                System.out.println(str);
            }
    
        }
    
        private static String getLongestSubString(String input) {
    
            Set<Character> set = new LinkedHashSet<Character>();
            String longestString = "";
            int len = input.length();
            for (int i = 0; i < len; i++) {
                char currentChar = input.charAt(i);
                boolean isCharAdded = set.add(currentChar);
                if (isCharAdded) {
                    if (i == len - 1) {
                        String currentStr = getStringFromSet(set);
    
                        if (currentStr.length() > longestString.length()) {
                            longestString = currentStr;
                        }
                    }
                    continue;
                } else {
                    String currentStr = getStringFromSet(set);
    
                    if (currentStr.length() > longestString.length()) {
                        longestString = currentStr;
                    }
                    set = new LinkedHashSet<Character>(input.charAt(i));
                }
    
            }
    
            return longestString;
        }
    
        private static String getStringFromSet(Set<Character> set) {
    
            Object[] charArr = set.toArray();
    
            StringBuffer strBuff = new StringBuffer();
            for (Object obj : charArr) {
                strBuff.append(obj);
    
            }
    
            return strBuff.toString();
        }
    }
    
    import java.util.HashSet;
    
    public class SubString {
        public static String subString(String input){
    
            HashSet<Character> set = new HashSet<Character>();
    
            String longestOverAll = "";
            String longestTillNow = "";
    
            for (int i = 0; i < input.length(); i++) {
                char c = input.charAt(i);
    
                if (set.contains(c)) {
                    longestTillNow = "";
                    set.clear();
                }
                longestTillNow += c;
                set.add(c);
                if (longestTillNow.length() > longestOverAll.length()) {
                    longestOverAll = longestTillNow;
                }
            }
    
            return longestOverAll;
        }
    
        public static void main(String[] args) {
            String input = "substringfindout";
            System.out.println(subString(input));
        }
    }
    
    def main():
        test='stackoverflow'
        tempstr=''
        maxlen,index=0,0
        indexsubstring=''
        print 'Original string is =%s\n\n' %test
    
        while(index!=len(test)):
            for char in test[index:]:
                if char not in tempstr:
                    tempstr+=char
                    if len(tempstr)> len(indexsubstring):
                       indexsubstring=tempstr
                elif (len(tempstr)>=maxlen):
                       maxlen=len(tempstr)
                       indexsubstring=tempstr
                       break
            tempstr=''
            print 'max substring length till iteration with starting index =%s is %s'%(test[index],indexsubstring)
            index+=1
    
    if __name__=='__main__':
        main()
    
    import java.util.Scanner;
    
    public class longestsub {
    
        static Scanner sn = new Scanner(System.in);
        static String word = sn.nextLine();
    
        public static void main(String[] args) {
            System.out.println("The Length is " +check(word));
        }
        private static int check(String word) {
            String store="";
            for (int i = 0; i < word.length(); i++) {
                if (store.indexOf(word.charAt(i))<0) {
                    store = store+word.charAt(i);
                }
            }
            System.out.println("Result word " +store);
            return store.length();
        }
    
    }
    
    public static String getLongestNonRepeatingString(String inputStr){
        if(inputStr == null){
            return null;
        }
    
        String maxStr = "";
        String tempStr = "";
        for(int i=0; i < inputStr.length(); i++){
            // 1. if tempStr contains new character, then change tempStr  
            if(tempStr.contains("" + inputStr.charAt(i))){
                tempStr = tempStr.substring(tempStr.lastIndexOf(inputStr.charAt(i)) + 1);
            }
            // 2. add new character
            tempStr = tempStr + inputStr.charAt(i);
            // 3. replace maxStr with tempStr if tempStr is longer
            if(maxStr.length() < tempStr.length()){
                maxStr = tempStr;
            }
        }
    
        return maxStr;
    }
    
    def lengthOfLongestSubstring(s):
          temp,maxlen,newstart = {},0,0
          for i,x in enumerate(s):
                if x in temp:
                      newstart = max(newstart,s[:i].rfind(x)+1)
                else:
                      temp[x] = 1
                maxlen = max(maxlen, len(s[newstart:i + 1]))
          return maxlen
    
    
        public int lengthOfLongestSubstring(String s) {
            int maxlen = 0;
            int start = 0;
            int end = 0;
            HashSet<Character> drawer = new HashSet<Character>(); 
            for (int i=0; i<s.length(); i++) {
                char ch = s.charAt(i);
                if (drawer.contains(ch)) {
                    //search for ch between start and end
                    while (s.charAt(start)!=ch) {
                        //drop letter from drawer
                        drawer.remove(s.charAt(start));
                        start++;
                    }
                    //Do not remove from drawer actual char (it's the new recently found)
                    start++;
                    end++;
                }
                else {
                    drawer.add(ch);
                    end++;
                    int _maxlen = end-start;
                    if (_maxlen>maxlen) {
                        maxlen=_maxlen;
                    }
                }
            }
            return maxlen;
        }
    
      function longestSubstringWithoutDuplication(str) {
          var max = 0;
    
          //if empty string
          if (str.length === 0){
            return 0;
          } else if (str.length === 1){ //case if the string's length is 1
            return 1;
          }
    
          //loop over all the chars in the strings
          var currentChar,
              map = {},
              counter = 0; //count the number of char in each substring without duplications
          for (var i=0; i< str.length ; i++){
            currentChar = str.charAt(i);
    
            //if the current char is not in the map
            if (map[currentChar]  == undefined){
              //push the currentChar to the map
                  map[currentChar] = i;
                  if (Object.keys(map).length > max){
                     max = Object.keys(map).length;
                  }
            } else { //there is duplacation
              //update the max
              if (Object.keys(map).length > max){
                max = Object.keys(map).length;
              }
              counter = 0; //initilize the counter to count next substring
              i = map[currentChar]; //start from the duplicated char
              map = {}; // clean the map
            }
          }
    
    
         return max;
        }
    
            public string LengthOfLongestSubstring(string s) {
        var res = 0;
        var dict = new Dictionary<char, int>();
        var start = 0;
    
        for(int i =0; i< s.Length; i++)
        {
            if(dict.ContainsKey(s[i]))
            {
                start = Math.Max(start, dict[s[i]] + 1); //update start index
                dict[s[i]] = i;
            }
            else
            {
                dict.Add(s[i], i);
            }
    
            res = Math.Max(res, i - start + 1);  //track max length
        }
        return s.Substring(start,res);
    }
    
    // O(n) time
    const allUnique = str => {
      const set = [...new Set(str)];
      return (set.length == str.length) ? true: false;
    }
    
    // O(n^3) time, O(k) size where k is the size of the set
    const lengthOfLongestSubstring = str => {
      let result = 0,
          maxResult = 0;
      for (let i=0; i<str.length-1; i++) {
        for (let j=i+1; j<str.length; j++) {
          if (allUnique(str.substring(i, j))) {
            result = str.substring(i, j).length;
            if (result > maxResult) {
              maxResult = result;
            }
          }
        }
      return maxResult;
      }
    }
    
    const lengthOfLongestSubstring = str => {
      let result = [],
          maxResult = 0;
    
      for (let i=0; i<str.length; i++) {
        if (!result.includes(str[i])) {
          result.push(str[i]);
        } else {
          maxResult = i;
        }
      }
    
      return maxResult;
    }
    
        import java.util.LinkedHashMap;
        import java.util.Map;
    
        public class example1 {
    
            public static void main(String[] args) {
                String a = "abcabcbb";
                   // output => 3
                System.out.println( lengthOfLongestSubstring(a));
    
            }
    
            private static int lengthOfLongestSubstring(String a) {
                   if(a == null  || a.length() == 0) {return  0 ;}  
                   int res = 0 ;
                Map<Character , Integer> map = new LinkedHashMap<>();
                  for (int i = 0; i < a.length(); i++) {
                      char ch = a.charAt(i);
                    if (!map.containsKey(ch)) {
           //If ch is not present in map, adding ch into map along with its position
                        map.put(ch, i);
    
                    }else {
    /*
    If char ch is present in Map, reposition the cursor i to the position of ch and clear the Map.
    */ 
                        i = map.put(ch, i);// updation of index
                         map.clear();
                    }//else
    
                    res = Math.max(res, map.size());
    
                }
    
    
    
                return res;
            }
    
        }
    
    String res ="";// global
        int len = 0 ;//global
     if(len < map.size()) {
         len = map.size();
        res = map.keySet().toString();
     }
    System.out.println("len -> " + len);
    System.out.println("res => " + res);
    
    var lengthOfLongestSubstring = function(s) {
        let length = s.length;
        let ans = 0;
        let start = 0,
            end = 0;
        let hashMap = {};
    
        for (var i = 0; i < length; i++) {
    
            if (!hashMap.hasOwnProperty(s[i])) {
                hashMap[s[i]] = i;
            } else {
                if (start <= hashMap[s[i]]) {
                    start = hashMap[s[i]] + 1;
                }
                hashMap[s[i]] = i;
            }
            end++;
            ans = ans > (end - start) ? ans : (end - start);
        }
        return ans;
    };
    
    def max_substring(string):
       last_substring = ''
       max_substring  = ''
       for x in string:
           k = find_index(x,last_substring)
           last_substring = last_substring[(k+1):]+x
           if len(last_substring) > len(max_substring):
                   max_substring  = last_substring        
       return max_substring
    
    def find_index(x, lst):
       k = 0
       while k <len(lst):
          if lst[k] == x:
             return k
          k +=1
       return -1
    
    def longestpalindrome(str1):
        arr1=list(str1)
        s=set(arr1)
        arr2=list(s)
        return len(arr2)
    
    
    
    str1='abadef'
    a=longestpalindrome(str1)
    print(a)
    
    a="stackoverflow"
    strLength = len(a)
    dct={}
    resStrLen=0
    cnt=0
    l=0
    r=0
    strb=l
    stre=l
    while(l<strLength and r<strLength):
        if a[l] in dct:
            if cnt>resStrLen:
                resStrLen=cnt
                strb=r
                stre=l
            dct.pop(a[r])
            cnt=cnt-1
            r+=1    
        else:
            cnt+=1
            dct[a[l]]=1
            l+=1
    
    if cnt>resStrLen:
        resStrLen=cnt
        strb=r
        stre=l
    
    print "Result String Length : "+str(resStrLen)
    print "Result String : " + a[strb:stre]
    
    #include<stdio.h>
    #include <string.h>
    
    void longstr(char* a, int *start, int *last)
    {
        *start = *last = 0;
        int visited[256];
        for (int i = 0; i < 256; i++)
        {
            visited[i] = -1;
        }
        int max_len = 0;
        int cur_len = 0;
        int prev_index;
        visited[a[0]] = 0;
        for (int i = 1; i < strlen(a); i++)
        {
            prev_index = visited[a[i]];
            if (prev_index == -1 || i - cur_len > prev_index)
            {
                cur_len++;
                *last = i;
            }
            else
            {
                if (max_len < cur_len)
                {
                    *start = *last - cur_len;
                    max_len = cur_len;
                }
                cur_len = i - prev_index;
            }
            visited[a[i]] = i;
        }
        if (max_len < cur_len)
        {
            *start = *last - cur_len;
            max_len = cur_len;
        }
    }
    
    int main()
    {
        char str[] = "ABDEFGABEF";
        printf("The input string is %s \n", str);
        int start, last;
        longstr(str, &start, &last);
        //printf("\n %d  %d \n", start, last);
        memmove(str, (str + start), last - start);
        str[last] = '\0';
        printf("the longest non-repeating character substring is %s", str);
        return 0;
    }
    
    public int lengthOfLongestSubstring(String s) {
        int startIndex = 0;
        int maxLength = 0;
        //since we have 256 ascii chars
        int[] lst = new int[256];
        Arrays.fill(lst,-1);
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            //to get ascii value of c
            int ic = (int) c;
            int value = lst[ic];
            //this will say to move start index to next index of the repeating char
            //we only do this if the repeating char index is greater than start index
            if (value >= startIndex) {
                maxLength = Math.max(maxLength, i - startIndex);
                startIndex = value + 1;
            }
            lst[ic] = i;
        }
        //when we came to an end of string
        return Math.max(maxLength,s.length()-startIndex);
    }
    
    public int lengthOfLongestSubstring(String s) {
        if(s.equals(""))
            return 0;
        String[] arr = s.split("");
        HashMap<String,Integer> map = new HashMap<>();
        Queue<String> q = new LinkedList<>();
    
        int l_till = 1;
        int l_all = 1;
        map.put(arr[0],0);
        q.add(arr[0]);
        for(int i = 1; i < s.length(); i++){
            if (map.containsKey(arr[i])) {
                if(l_till > l_all){
                    l_all = l_till;
                }
                while(!q.isEmpty() && !q.peek().equals(arr[i])){
                    map.remove(q.remove());
                }
                if(!q.isEmpty())
                   map.remove(q.remove());
                q.add(arr[i]);
                map.put(arr[i],i);
                //System.out.println(q);
                //System.out.println(map);
                l_till = q.size();
            }
            else {
                l_till = l_till + 1;
                map.put(arr[i],i);
                q.add(arr[i]);
            }
        }
        if(l_till > l_all){
                    l_all = l_till;
                }
        return l_all;
    }