3.给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

在这里插入图片描述
原题链接: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;        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值