没啥技术难点,需要注意的是非重复字段,最开始我没理解明白,比如abcdefag,检查到第二个a时,应该接着从b开始继续比对,我一开始却是接着从g开始。最后附上自己的代码以及社区最高票的代码。

 1 //我自己的代码 效率较低  
 2 public int lengthOfLongestSubstring(String s) {
 3         char[] chars = s.toCharArray();
 4         StringBuilder sb = new StringBuilder();
 5         int maxLen = 0;
 6         for(int i = 0;i < chars.length;i++){
 7             if(sb.toString().indexOf(String.valueOf(chars[i])) >= 0){
 8                 if(maxLen < sb.toString().length())
 9                 {
10                      maxLen = sb.toString().length();
11                 }
12                 String newString = sb.toString().substring(sb.toString().indexOf(String.valueOf(chars[i])) + 1);
13                 sb = new StringBuilder();
14                 sb.append(newString);
15             }
16             sb.append(String.valueOf(chars[i]));
17         }
18         return maxLen>= sb.toString().length()?maxLen:sb.toString().length();
19     }
//最高票代码。主要利用了hashMap的key唯一性,用字符做key,对应的下标做value,遇到重复的字符,hashmap的put操作会覆盖掉value。
public int lengthOfLongestSubstring(String s) {
        if (s.length()==0) return 0;
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        int max=0;
        for (int i=0, j=0; i<s.length(); ++i){
            if (map.containsKey(s.charAt(i))){
                //找出重复字符的下一个字符的下标
                j = Math.max(j,map.get(s.charAt(i))+1);
            }
            map.put(s.charAt(i),i);
            //计算当前字符下标到重复字符下一个字符的下标的非重复字符个数
            max = Math.max(max,i-j+1);
        }
        return max;
    }    

 

 

posted on 2019-12-02 17:14  _LiuShu  阅读(112)  评论(0)    收藏  举报