Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

題意:給一個字符串,找出沒有重複的最長子串,求出元素個數。

思路:在左側設置兩個指針i,j,j不斷向右移動。將j指針指到的元素判斷,若是不在map中,則加入map。不然統計map中的元素個數,爲當前子串的不一樣元素個數,而後將map中從i開始到與當前j指針發生衝突的元素位置位置的元素所有刪除,而後把i指針指向當前衝突元素的右側。

實現:java

public class Solution {
     public int lengthOfLongestSubstring(String s ) {
           int max =0;
        Map<Character,Integer> map= new HashMap<Character,Integer>();
        char[]arr =s .toCharArray();
        for(int i =0,j =0;j <s .length();j++){//設置兩個指針,從左向右遍歷
           if(map .containsKey(arr[j])){//若是當前元素在map中,則表示有衝突。若是把當前元素加入子串也不會增長最大不一樣元素數,因此統計當前的元素數
               if(map .size()>max)
                    max= map.size();
               int index =map .get(arr [j ]);//找到map中形成衝突的元素
               for(int x =i ;x <=index ;x ++){//從左側的指針開始到index爲止的元素從map中刪除
                    map.remove( arr[ x]);
              }
               map.put( arr[ j], j); //把當前元素加入map中
               i= index+1; //左側指針指導index的右側
          } else{//若是不在map中,則將當前元素加入map中
               map.put( arr[ j], j);
          }
        }
        return max >map .size()?max :map .size();//返回歷史最大值與當前map元素中較大的值
    }
}
相關文章
相關標籤/搜索