• LeetCode(3) - Longest Substring Without Repeating Characters


      这题的题意大概就是给你一个字符串"abcdecde",找到最长的子字符串长度,里面所有的子母都不重复。本例子中最长的满足条件的子字符串就是"abcde",所以应该返回的是5。这一题如果不用暴力解决的方法的话,我优先想到的数据结构是HashMap,因为它能够判断字母是否重复,并且记录每个字母的index。而现在唯一的难点就是,怎么通过HashMap来找到这个最长字符串。因为要记录子字符串的长度,从而,肯定需要两个index,一个index1作为子字符串的头,另一个index2再往后移动,直到index2碰到index1和index2之间出现过的元素(假设位置为i),则记录length = index2 - index1(不需要加1是因为index2是重复元素,所以得以index2-1来算),同时,要把HashMap里面index1和i之间的元素给删掉,index1从i+1开始,index2继续走下去。每一次记录length,都要判断是否比之前最长的length要长,如果是,就更新它,不是,就跳过。

      这里还有一个边界条件。就是,当index2走完整个字符串的时候,length并不会被记录,所以在循环外得判断一遍。

      代码如下:

    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            if (s.length() == 0 || s.length() == 1) return s.length();
            HashMap<Character,Integer> map = new HashMap<Character, Integer>();
            //length为最大长度,head为当前子字符串的头指针。
            int length = 0;
            int head = 0;
            //把第一个字母放到map里。
            map.put(s.charAt(head),head);
            for (int i = 1; i < s.length(); i++) {
                char c = s.charAt(i);
                //contain的话,说明i和head之间存在与c相同的元素。
                if (map.containsKey(c)) {
                    //找出重复元素的位置index。并去掉map里面index前所有的字符(包括该字符)
                    int index = map.get(c);
                    for (int j = head; j <= index; j++) {
                        map.remove(s.charAt(j));
                    }
                    //记录并比较当前最长的length
                    length = Math.max(length,i - head);
                    //head从index+1开始(index和i重复,所以从index+1开始)
                    head = index+1;
                }
                map.put(c,i);
            }
            //最后再判断前面说的边界条件,上面循环并没有记录i走到字符串尾时的子字符串长度。
            if (head != s.length() - 1) {
                length = Math.max(length, s.length() - head);
            }
            return length;
        }
    }
  • 相关阅读:
    LeetCode 第三大的数414. Third Maximum Number
    ltp工具使用配置
    eclipse 导入项目时候java版本不一致问题
    GitHub上传不了的解决 ssh: connect to host github.com port 22: Bad file number git did not exit cleanly (exit code 128)
    Python文件中文编码问题
    图算法习题
    VMware连不上网解决
    自定义结构或类的比较
    贪心算法
    编写Lex和Yacc
  • 原文地址:https://www.cnblogs.com/kepuCS/p/5220242.html
Copyright © 2020-2023  润新知