zoukankan      html  css  js  c++  java
  • LeetCode——Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

    问题描述:

    给定一个字符串,寻找最长无重复子串,返回最长长度。

    解决方案:

    1、暴力搜索,O(n^2)不考虑。

    2、举个例子,abcdecf

    说明:使用两个游标,i、j 初始为0,len为字符串长度,maxLen为要返回的无重复最长子串的长度,exist数组为标识元素是否重复,默认支持ASCII,数组大小开到256.

    a)对于字符串 a b c d e c f 来说:i 增长到第二个'c'的下标[5],发现之前'c'出现过;

    b)这时,首先更新最大长度;

    c)然后while循环执行 j++ 自增到第一个'c',同时将第一个'c'之前的元素的存在标志清除。

    d)i++,j++,从a b c d e f 处继续向后执行

    e)最后在return之前,再更新maxLen

     1 public int lengthOfLongestSubstring(String s) {
     2         int len = s.length();
     3         boolean[] exist = new boolean[256];
     4         for (int i = 0; i < 256; i++) {
     5             exist[i] = false;
     6         }
     7         int i = 0, j = 0;
     8         int maxLen = 0;
     9         while (i < len) {
    10             if (!exist[s.charAt(i)]) {//如果访问的元素没有出现过
    11                 exist[s.charAt(i)] = true;
    12                 i++;
    13             } else {//发现两个一样的,现在i指向两个元素中的第二个
    14 
    15                 maxLen = Math.max(i - j, maxLen);//更新最大长度
    16                 while (s.charAt(i) != s.charAt(j)) {
    17                     exist[s.charAt(j)] = false;//重置exist数组
    18                     j++;
    19                 }//while循环结束后,现在i、j都是指向那个重复元素,j指向第一个
    20                 i++;
    21                 j++;
    22             }
    23         }
    24         maxLen = Math.max(maxLen, len - j);//最后再更新最大程度
    25         //System.out.println(maxLen);
    26         return maxLen;
    27     }

    重新做了一遍,发现还没第一次做的好:

    public int lengthOfLongestSubstring(String s) {
            if (s == null || s.length() == 0) {
                return 0;
            }
            HashMap<Character, Integer> exist = new HashMap<>();
            int len = 0, res = 0, last_j = 0;
            for (int i = 0; i < s.length(); i++) {
                if (exist.get(s.charAt(i)) == null) {
                    exist.put(s.charAt(i), i);
                    len++;
                } else {
                    int j = exist.get(s.charAt(i));
                    len = i - j;
                    for (int k = last_j; k <= j; k++) {
                        exist.remove(s.charAt(k));
                    }
                    exist.put(s.charAt(i), i);
                    last_j = j + 1;
                }
                res = Math.max(len, res);
            }
            System.out.println(res);
            return res;
        }

    原创文章,转载请注明出处。

  • 相关阅读:
    十分钟-Nginx 入门到上线
    83.面向忙碌开发者的 Android 知识点收录 (转)
    技术人,为什么需要构建知识图谱 (转载)
    C# 4.0四大新特性代码示例与解读
    .NET 项目代码风格要求
    .NET 推荐博客
    C# 五、谈扩展方法的理解
    ASP.NET 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)
    ASP.NET 你必须知道的EF知识和经验
    Linq表达式、Lambda表达式你更喜欢哪个?
  • 原文地址:https://www.cnblogs.com/aboutblank/p/3692555.html
Copyright © 2011-2022 走看看