美文网首页
BAT面试算法进阶(4)- 无重复字符的最长子串(滑动法优化+A

BAT面试算法进阶(4)- 无重复字符的最长子串(滑动法优化+A

作者: CC老师_HelloCoder | 来源:发表于2018-08-14 14:38 被阅读0次

    BAT面试算法进阶(3)- 无重复字符的最长子串(滑动窗口法)
    BAT面试算法进阶(2)- 无重复字符的最长子串(暴力法)
    BAT面试算法进阶(1)--两数之和

    上一次分享的是滑动窗口解决方法.执行的次数2N个步骤.但是是否还有办法优化了? 答案是肯定的!

    一.算法题

    • 题目

    Given a string, find the length of the longest substring without repeating characters.

    • Example
    • Given "abcabcbb", the answer is "abc", which the length is 3.
    • Given "bbbbb", the answer is "b", with the length of 1.
    • Given "pwwkew", the answer is "wke", with the length of
    • Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

    二.算法题解读

    • 题目大意:给定一个字符串,找出不含有重复字符的最长子串的长度

    • 解读Example

    • 给定"abcabcbb",没有重复字符的最长子串是"abc",那么长度就是3
    • 给定"bbbbb",最长子串就是"b",长度就是1
    • 给定pwwkew,最长子串就是"wke",长度为3,
    • ==注意,==必须是一个子串."pwke",是子序列,而不是子串

    三.优化"滑动窗口"解决思路

    到底如何在滑动窗口方法上优化了? 实际上我们可以如果采用进一步优化,可以达到只需要N次即可计算成功.我们可以定义字符到索引映射.而不是使用集合来判断这个字符的存在与否.当遇到重复的字符时,我们即可跳过该滑动窗口.

    也可以理解为,如果s[j][i,j)的范围内有与j'重复的字符.我们不需要逐渐增加i.而是直接跳过[i,j']范围内的所有元素.并将i变成为j'+1就可以做到.

    四.代码实现

    java code

    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            int n = s.length(), ans = 0;
           //获取当前字符索引
            Map<Character, Integer> map = new HashMap<>();         
            //修改[i,j]的范围       
             for (int j = 0, i = 0; j < n; j++) {
                if (map.containsKey(s.charAt(j))) {
                    i = Math.max(map.get(s.charAt(j)), i);
                }
                ans = Math.max(ans, j - i + 1);
                map.put(s.charAt(j), j + 1);
            }
            return ans;
        }
    }
    

    五.使用ASCII 128码 思路

    字符串,其实由字符构成.而字符则可以用ASC码来替代.如此,我们可以用整数数组作为直接访问表来替换Map.

    常用表如下:
    int [26],用于表示字母 "a" - "z" 或 "A" - "Z";
    int [128],用于表示ASCII码
    int [256],用于表示扩展ASCII码
    A = 65, a = 97

    ASCII码.png

    六.代码实现

    java code

    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            int n = s.length(), ans = 0;
            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;
        }
    }
    
    

    小编OS:

    如有疑问,留言即可.胖C会利用空余时间给大家做一个简单解答的.
    持续更新关注公众号!

    HelloCode 微信公众号

    相关文章

      网友评论

          本文标题:BAT面试算法进阶(4)- 无重复字符的最长子串(滑动法优化+A

          本文链接:https://www.haomeiwen.com/subject/vthvbftx.html