LeetCode题解 #3 Longest Substring Without Repeating Characters

找出字符串中没有相同字符的的最长串

注意这里的 Characters指的是字符,不是字母,就是说|/?~这样的字符都会出现,所以要用到ASCII码

 

最简单的方法是,从第一个字符开始,往后一个个判断,里面有没有重复的字符,如果重复了则记录下长度。

例如:abcabcbb

第一次:abc 重复于a  长度3

第二次:bca 重复与b  长度3

第三次:cab 重复与c  长度3

......

 

但这种方法很耗时

如果是 abcdefghijk这种

第一次就找到了的 abcdefghijk

但还要第二次往后 bcdefghijk 第三次的cdefghijk ......

 

一个改进的方法是

也是从头往后一个个判断,但是不是头一个个的往后,而是如果有重复的字符,则找到字符串中的重复字符,以该字符的下一个字符为头开始判断。

例如:

abcdefgfb

第一次的adcdefg 重复于f

就从g开始:gfb

因为肯定要从重复字符的后一个开始啊,前面的都包含了这个字符了,后面一定会重复的啦。

 

要边判断的同时边记录大小,判断的话用一个127大小的int数组判断,如果出现过该字符,就使数组元素为1:

 

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        
      
        
        int head=0;
        int tail=0;
        
        int length = s.length();
        
        int max = 0;
        int temp = 0;
        
        
        while(head<length){
            
            temp = 0;
            
            int [] record = new int [127];
            
            
            
            
            
            tail=head;
            
            //如果没有出现过
            
            
            while(tail<length&&record[(int)(s.charAt(tail))]==0){
                
                //System.out.print(s.charAt(tail));
                
                record[(int)(s.charAt(tail))]=1;
                tail++;
                temp++;
                
                
                
                
            }
            
            //System.out.println();
            
            if(temp>max)
                max=temp;
            
            //跳出循环 即是说已经出现了重复的字符了
            //或者已经到句末了
            if(tail>=length)
                break;
            
            if(tail<length){
            char chongfu = s.charAt(tail);
            
            //System.out.println(chongfu+"!");
            
            //把head一直移到出现过的字符后面
            
            while(s.charAt(head)!=chongfu){
                
                head++;
                
            }
            
            head++;
            
            }
            
            
        }
        
        //System.out.println(max);
        return max;
        
        
    }
}

 

你可能感兴趣的:(LeetCode题解 #3 Longest Substring Without Repeating Characters)