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 asubstring, "pwke"
is a subsequence and not a substring.
解决方案1:粗暴的直接遍历,O(n^4)
public static int lengthOfLongestSubstring(String s) {
if(s.length()==0)return 0;
int length=1;
char[] a=s.toCharArray();
int i=0,j=0,k=0,l=0;
boolean flag=true;
for(i=0;i<s.length()-1;i++){
flag=true;
A:
for(j=i+1;j<s.length();j++){
for(k=i;k<j;k++){
for(l=k+1;l<=j;l++){
if(a[k]==a[l]){
flag=false;
break A;
}
}
}
if(flag){
int temp=j-i+1;
System.out.println(temp+" "+j+" "+i);
if(temp>length)length=temp;
}
}
}
return length;
}
解决方案2:优化后,将长度作为变量进行循环,但还是没有本质上的区别,还是没有能够逃脱O(n^4)的厄运
public static int lengthOfLongestSubstring(String s) {
if(s.length()==0)return 0;
int length=1;
int StringLength=s.length();//8
int subLength=StringLength;
int i=0;
char[] a=s.toCharArray();
A:
for(;subLength>1;subLength--){
for(i=0;i+subLength-1<StringLength;i++){
if(checkRepeat(i,i+subLength-1,s)){
//System.out.println(i+" "+(i+subLength-1));
return subLength;
}
}
}
return length;
}
public static boolean checkRepeat(int start,int end,String s){
char[] a=s.toCharArray();
for(int i=start;i<end;i++){
for(int j=i+1;j<=end;j++){
if(a[i]==a[j])
return false;
}
}
return true;
}
解决方案3:以上两种方案均在最后一组数据出错,最后一个数据为:
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ abcdefghij”
参考http://blog.csdn.net/waycaiqi/article/details/45936181,在此处也贴出他的代码,采用类似计算机网络中的窗口协议,通过hash表来快速的进行筛选,非常的高效,这组测试数据答案为95,时间较长但还是可以接受的范围。
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null && s.length()==0)
return 0;
HashSet<Character> set = new HashSet<Character>();
int max = 0;
int walker = 0;
int runner = 0;
for(;runner<s.length();runner++)
{
if(set.contains(s.charAt(runner)))
{
max = (runner-walker)>max?(runner-walker):max;
while(s.charAt(walker)!=s.charAt(runner))
{
set.remove(s.charAt(walker));
walker++;
}
walker++;
}
else
{
set.add(s.charAt(runner));
}
}
max = (runner-walker)>max?(runner-walker):max;
return max;
}
}
再贴一个学霸的代码,拿到授权了,就不贴地址了:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int c[256] = {0};
int first = 0, last = 0;
int len = 0;
int maxlen = 0;
for(int i = 0; i < s.size(); ++i){
if(c[s[i]]){
if(len > maxlen)
maxlen = len;
last = c[s[i]];
for(int j = first; j < last; ++j){
len--;
c[s[j]] = 0;
}
first = last;
}
len++;
c[s[i]] = i + 1;
}
if(len > maxlen)
maxlen = len;
return maxlen;
}
};