没啥技术难点,需要注意的是非重复字段,最开始我没理解明白,比如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; }
浙公网安备 33010602011771号