力扣刷题日记 2020/03/26

面试很受伤,但是刷题不能停!!

题干

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
      请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

解题思路:

      这个题目力扣给难度标记为中等,但解题思路其实很好想, 相当于给这个字符串加上两个“指针”: 一个指向字符串子串的起始位置(简称为start指针),另一个向后遍历(简称为end指针),并将遍历到的字母存储一个“容器内”(是不是想到了HashMap了?),直到后边的指针遍历到重复的字母为止,记录下此时的start到end之间的子串长度,(HashMap的contains方法)此时将start指针移动到此时的end指针位置,重复遍历,最后取每次遍历到的最大值即为最长不重复子串的长度了。

      

上代码:

 

class Solution {
    public int lengthOfLongestSubstring(String s) {

        int n = s.length(), ans = 0;
        Map<Character, Integer> map = new HashMap<>();

        for (int end = 0, start = 0; end < n; end++) {
char alpha = s.charAt(end);
        //判断遍历的alpha是否重复 if (map.containsKey(alpha)) { start = Math.max(map.get(alpha), start); }
        //获取最大子串长度 ans = Math.max(ans, end - start + 1);
         map.put(s.charAt(end), end + 1); } return ans; } }

猜你喜欢

转载自www.cnblogs.com/seizedays/p/12577384.html