前言:最近开学事情特别多,隔了一个月没刷题,真是蛋疼。
----------------------
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
首先想到的最简单的O(n^2)的时间效率代码,提交之后果然超时。
public class Solution {
public int lengthOfLongestSubstring(String s) {
int maxLength = 0;
for(int i = 0 ; i < s.length() - maxLength; i ++){
HashMap<Character,Integer> s_map = new HashMap<Character,Integer>();
for(int j = i; j < s.length(); j ++){
if(s_map.containsKey(s.charAt(j))) break;
else s_map.put(s.charAt(j),j);
}
if(s_map.size() > maxLength) maxLength = s_map.size();
}
return maxLength;
}
}
稍微进行了改动,当碰到第一个重复的字符串的时候,将i的值扩大。但是效率还是比较低, You are here!
Your runtime beats 3.07% of java submissions.。效果有点差,后续再看怎么改进
public class Solution {
public int lengthOfLongestSubstring(String s) {
int maxLength = 0;
for(int i = 0 ; i < s.length() - maxLength; i ++){
HashMap<Character,Integer> s_map = new HashMap<Character,Integer>();
for(int j = i; j < s.length(); j ++){
if(s_map.containsKey(s.charAt(j))) {i = s_map.get(s.charAt(j));break;}
else s_map.put(s.charAt(j),j);
}
if(s_map.size() > maxLength) maxLength = s_map.size();
}
return maxLength;
}
}