在做这道题时,想的有点复杂,但还是根据用例accepted,后面看了一些解决方法,先附上我的解决方法
思路就是:从s的第一个字符开始遍历,在遇到重复的就将这个字符串保存,从重复字符的下一个开始遍历,遇到重复就将字符串保存,并与之前的比较,留下最长的,以此类推。
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.equals("")){
return 0;
}
StringBuffer str1 = new StringBuffer(s.substring(0,1));
String str2 ="";
String str3 ="";
for (int i = 1; i < s.length(); i++) {
int index = str1.indexOf(s.substring(i, i + 1));
if (str1.indexOf(s.substring(i, i + 1)) >= 0) {
if (str1.length() >= str2.length()) {
str2 = str1.toString();
str1.setLength(0);
str1 = str1.append(str2.substring(index + 1, str2.length())).append(s.substring(i, i + 1));
} else {
str3 = str1.toString();
str1.setLength(0);
str1 = str1.append(str3.substring(index + 1, str3.length())).append(s.substring(i, i + 1));
}
} else {
str1 = str1.append(s.charAt(i));
}
}
if(str1.length()>str2.length()){
str2 = str1.toString();
}
return str2.length();
}
}
后面看了solution……
第一个是取s的每一个子串,并将含有重复的去除,再在其中取长度的最大值
第二个是滑动窗口算法Sliding Window,之前对这个算法没有了解过,确实发现简单了不少,思路比较清晰,时间复杂度也下降了
第三个是动态滑动窗口,比滑动窗口的时间复杂度又减小