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

3.给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。_第1张图片
原题链接: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;        
    }
}

你可能感兴趣的:(leetcode,java)