题目
Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: “abcabcbb”
Output: 3
Explanation: The answer is “abc”, with the length of 3.
Example 2:
Input: “bbbbb”
Output: 1
Explanation: The answer is “b”, with the length of 1.
Example 3:
Input: “pwwkew”
Output: 3
Explanation: 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.
思路
这道题就是让大家找到一个字符串里面,最长的不重复子串,包括其本身。
一开始思路就是直接使用函数index()直接查询下一个相同字母的地方,然后直接相减得到最大值就是结果。不过好像是错的,有大佬闲着没事的话可以去试一试,反正笔者试了一下没成功(好像在误人子弟)。
之后发现还是得把字符串分不同的长度切割,然后一个一个判断,最后得到最终的结果,因为他是要得到最长的字符串长度,所以我就从最长的一个字符串开始(输入的哪一个字符串)依次递减。
需要注意的就是,这种方法对于不太长的字符串来说还可以,太长的电脑跑死也跑不出来,反正我跑了一个小时也没结果,输入也就3300个字符。之后就头秃时间复杂度的问题,最后灵机一动,字符串按道理一共也就128个(题目中具体有多少我不知道,反正我就按照ASCII码来了),这样一个不重复的字符串最大长度也就128,这就大大减少了循环的次数。
最后就是边界值和空格的问题,每特别机制的处理方式,直接试吧,动脑子太累了。
代码
这次想不开了,有注释了
public class T003 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println( lengthOfLongestSubstring("asdasd") );
}
public static int lengthOfLongestSubstring(String s) {
int sl = s.length();
int tl = 0;
//如果字符串长度小于等于1,肯定不重复。直接返回结果0/1
if( sl <= 1 )
return sl;
//第一个循环,i每加一,子串的长度就减少一,从零开始,也就是说子串的长度从s.length()开始
for( int i = 0; i<sl; i++ ) {
//用来切割字符串S,得到子串,子串每减少1,那么切割得到的子串个数就加一
//其中对子串长度进行了限制,最大128也就是(sl>128 ? sl-127 : i+1)这一行代码
for( int j = 0; j < (sl>128 ? sl-127 : i+1); j++ ) {
//切割,从而得到子串
String temp = s.substring( j, j+(sl>128 ? 128 : sl)-i );
//System.out.println( i + "\t" + temp );
tl = temp.length();
//用来判断是不是要得到的子串
for( int k = 0; k<tl; k++ ) {
//如果出现重复的就跳出循环
if( temp.indexOf(temp.charAt(k), k+1) != -1 )
break;
//循环到了最后一次了,没问题,那可不就是咱要输出的
if( k == tl-1 ) {
//System.out.println("\n\n"+ temp + "\t" + sl );
return tl;
}
}
}
}
return 0;
}
}