原题链接: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; } }