原题链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
这道题题目要求很少,看起来也比较简单,需要注意就是答案是子串的长度,最重要的是我做过类似的。。。。
class Solution {
public int lengthOfLongestSubstring(String s) {
//开始是子串的长度假设为1
int sum=1;
//将字符串转化为数组
char[] c=s.toCharArray();
List<Character> list=new ArrayList<Character>();
//刚开始我用的while,结果就一直超时。残忍
if(c.length==0) {
return 0;
}else{
//双重循环多次遍历
for(int i=0;i<c.length;i++) {
for(int j=i;j<c.length;j++) {
//去重
if(!list.contains(c[j])) {
list.add(c[j]);
}else{
if(list.size()>=sum) sum=list.size();
//运行完清空属性,不然喜+1
list.clear();
break;
}
}
}
return sum;
}
}
}
每次做这种题第一时间想的都是字符串转化为数组,结果这种方法执行用时长,消耗内存大
还看到别人直接用字符串做的一个,虽然感觉有点绕,但是看懂之后思路感觉还是挺清晰的
class Solution {
public static int lengthOfLongestSubstring(String s) {
if (s.isEmpty()){//判断字符串是否为空
return 0;
}else{
int max=1;//先假设1就为最大值
int sum=1;
String s1=""+s.charAt(0);//获取字符串中第一个字符,将其作为flag
for (int i = 0; i < s.length(); i++) {
if(s1.indexOf(""+s.charAt(i))!=-1){//判断flag字符中是否还有下一个字符
int n1=s1.length()-s1.indexOf(""+s.charAt(i))-1;//找到flag字符中含有下一个字符的位置,并截取其后字符的长度
sum=n1+1;
s1=s1.substring(s1.indexOf(""+s.charAt(i))+1,s1.length())+s.charAt(i);//末端的重复字符形成新的flag字符
}else{
sum=sum+1;//flag字符中没有有下一个字符,sum+1并在flag字符中加上下一个字符
s1=s1+s.charAt(i);
}
if(sum>max){//当sum>max,替换max
max=sum;
}
}
return max;
}
}
}
最后还有一个用滑动窗口的代码,感觉好叼
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
//创建一个长度为128的新数组
int[] index = new int[128];
for (int j = 0, i = 0; j < n; j++) {
i = Math.max(index[s.charAt(j)], i);
ans = Math.max(ans, j - i + 1);
index[s.charAt(j)] = j + 1;
}
return ans;
}
}