当前位置:网站首页>Leetcode. 3. Longest substring without repeated characters - more than 100% solution

Leetcode. 3. Longest substring without repeated characters - more than 100% solution

2022-07-06 13:36:00 Li bohuan

        subject : Given a string  s , Please find out that there are no duplicate characters in it   Longest substrings   The length of .

        Example 1:

 Input : s = "abcabcbb"
 Output : 3 
 explain :  Because the longest substring without repeating characters is  "abc", So its  The length is  3.
 Input : s = "bbbbb"
 Output : 1
 explain :  Because the longest substring without repeating characters is  "b", So its length is  1        

        The code is as follows : 

 public int lengthOfLongestSubstring(String s) {
        if(s == null || s.equals("")){
            return 0;
        }
        // With i How far to the left do you push the end without repeating  ( consider a The location of the last occurrence and i-1 How far can we push )
        char[] chars = s.toCharArray();
        int n = chars.length;
        //0-255 Of ASCII code    use 256 The length array can represent all characters  ASCii Code a byte   The longest 256  But now it is defined 128 Characters 
        //map[i] = v  representative i This ascii Code last appeared in v Location 
        //char Put characters in map The array will be automatically converted to int type   Its value is char Character ascii Code value   such as 'a' Namely 97
        int[] map = new int[128];
        for(int i = 0; i < map.length; i++){
            map[i] = -1;// Means that all characters are in -1 The position has appeared 
        }
        int ans = 1;// Initial answer 
        int pre = 1;// How long did the previous position push to the left ( Including myself )
        map[chars[0]] = 0;// The first character is in 
        for(int i = 1; i < n; i++){
            // Consider the character char[i] Where it was last seen  
            // for example adcba 01234 Then length is character char[i] The present position i Subtract the last position map[char[i]]
            // 4 - 0 = 4  That is to say dcba
            int p1 = i -map[chars[i]];
            // Consider how much the previous position pushed to the left   Add yourself   Is the position you can push 
            int p2 = pre + 1;
            // The minimum value of the two is the length that the current position can be pushed forward 
            int cur = Math.min(p1,p2);
            // Take the maximum of all the answers 
            ans = Math.max(ans,cur);
            // Continue the cycle later , So update pre  and char[i] Where it was last seen 
            pre = cur;
            map[chars[i]] = i;
        }
        return ans;
    }

          The main idea is dynamic planning , Considering that i How far can the ending character be pushed forward , This is related to how far the previous character can be pushed forward , Use an array map Store the last occurrence of this character , Initialize to -1, In order to calculate the distance , The calculation formula is unified .

 

原网站

版权声明
本文为[Li bohuan]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060916514198.html