首页 > 编程语言 >每日算法之最长不含重复字符的子字符串

每日算法之最长不含重复字符的子字符串

时间:2022-12-20 14:45:31浏览次数:46  
标签:tmp 字符 right charAt map int max 算法 字符串

JZ48 最长不含重复字符的子字符串

描述

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例1
输入:"abcabcbb"
返回值:3
说明:因为无重复字符的最长子串是"abc",所以其长度为 3。  

方法1

思路

维护一个数组,想里面添加元素,直至出现第一个重复元素位置,计算数组长度作为一次结果
将每一个元素都作为开始元素,利用两次for,将全部不重复子字符串全部计算出来,取出最大数

代码

int max = Integer.MIN_VALUE;
        List<Character> tmp = new ArrayList<>();
        if(s == null && s.length() == 0) return 0;
        for(int i = 0; i < s.length(); i++) {
            for(int j = i; j < s.length(); j++) {
                if(tmp.contains(s.charAt(j))) break;
                tmp.add(s.charAt(j));
            }
            max = Math.max(max, tmp.size());
            tmp.clear();
        }
        return max;

方法2

思路

既然要找一段连续子串的内不重复的长度,我们可以使用滑动窗口,保证窗口内都是不重复的,然后窗口右界不断向右滑,如果窗口内出现了重复字符,说明新加入的元素与之前的重复了,只需要窗口左界也向右收缩就可以保证窗口内都是不重复的。

具体做法:
step 1:构建一个哈希表,用于统计字符元素出现的次数。
step 2:窗口左右界都从字符串首部开始,每次窗口优先右移右界,并统计进入窗口的元素的出现频率。
step 3:一旦右界元素出现频率大于1,就需要右移左界直到窗口内不再重复,将左边的元素移除窗口的时候同时需要将它在哈希表中的频率减1,保证哈希表中的频率都是窗口内的频率。
step 4:每轮循环,维护窗口长度最大值。

代码

HashMap<Character, Integer> map = new HashMap<>();
        int res = 0;
        for (int left = 0, right = 0; right < s.length(); right++) {
            //标记重复的元素
            if (map.containsKey(s.charAt(right))) {
                //窗口右移进入哈希表统计出现次数
                map.put(s.charAt(right), map.get(s.charAt(right)) + 1);
            } else {
                map.put(s.charAt(right), 1);
            }

            //左边界向右移知道没有重复元素
            while (map.get(s.charAt(right)) > 1) {
                map.put(s.charAt(left), map.get(s.charAt(left++)) - 1);
            }

            //维护子字符串最大长度
            res = Math.max(res, right - left + 1);
        }

        return res;

整体代码

package mid.JZ48最长不含重复字符的子字符串;

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型
     */
    public int lengthOfLongestSubstring (String s) {
        // write code here
        //方法1
        /*int max = Integer.MIN_VALUE;
        List<Character> tmp = new ArrayList<>();
        if(s == null && s.length() == 0) return 0;
        for(int i = 0; i < s.length(); i++) {
            for(int j = i; j < s.length(); j++) {
                if(tmp.contains(s.charAt(j))) break;
                tmp.add(s.charAt(j));
            }
            max = Math.max(max, tmp.size());
            tmp.clear();
        }
        return max;*/

        //方法2
        HashMap<Character, Integer> map = new HashMap<>();
        int res = 0;
        for (int left = 0, right = 0; right < s.length(); right++) {
            //标记重复的元素
            if (map.containsKey(s.charAt(right))) {
                //窗口右移进入哈希表统计出现次数
                map.put(s.charAt(right), map.get(s.charAt(right)) + 1);
            } else {
                map.put(s.charAt(right), 1);
            }

            //左边界向右移知道没有重复元素
            while (map.get(s.charAt(right)) > 1) {
                map.put(s.charAt(left), map.get(s.charAt(left++)) - 1);
            }

            //维护子字符串最大长度
            res = Math.max(res, right - left + 1);
        }

        return res;
    }

    public static void main(String[] args) {
        System.out.println(new Solution().lengthOfLongestSubstring("Kzz8"));
    }
}

标签:tmp,字符,right,charAt,map,int,max,算法,字符串
From: https://www.cnblogs.com/loongnuts/p/16994139.html

相关文章

  • 字符串分割问题
    P1117[NOI2016]优秀的拆分先考虑求出\(AA\)的形式有多少。两个子串相等,可以看作是对于某两个点,它的LCP和LCS正好覆盖了这两个串。而两个串之间的距离正好是这两......
  • 【C语言】strlen 计算字符串长度
     ......
  • 【C语言】strcpy() 复制字符串
     ......
  • 基础算法(排序 & 查找)
    快速排序、归并排序、整数二分查找、浮点数二分查找快速排序主要思想是分治:确定分界点调整范围递归处理左右两段代码:#include<iostream>usingnamespacestd;......
  • Python面试常见算法题集锦(递归部分)
    0x1前言开始学习python基础的时候,有以下几种算法是面试中常见的,也是前期学习python的时候可以连带学习了解的,不卡门槛哟0x2实现算法的方式很多种,而算法的实现也是分程......
  • 二分法搜索算法
    今天看书时,书上提到二分法虽然道理简单,大家一听就明白但是真正能一次性写出别出错的实现还是比较难的,即使给了你充足的时间,比如1小时。如果你不是特别认真的话,可能还是会出......
  • 基于MATLAB的pso粒子群算法优化——计算样本再拟合函数最大值
    1.算法概述       PSO是粒子群优化算法(——ParticleSwarmOptimization)的英文缩写,是一种基于种群的随机优化技术,由Eberhart和Kennedy于1995年提出。粒子群算法模......
  • 深入理解【缺页中断】及FIFO、LRU、OPT这三种置换算法
    缺页中断(英语:Pagefault,又名硬错误、硬中断、分页错误、寻页缺失、缺页中断、页故障等)指的是当软件试图访问已映射在​​虚拟​​​​地址空间​​​中,但是目前并未被加载在......
  • Java实现7种常见密码算法
    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。简介前面在密码学入门一文中讲解了各种常见的密码学概念、算法与运用场景,但没有介绍过代码,因此,为作补充,这......
  • SpringMVC传递json字符串,后台接口通过变量接收
    前景介绍在我们日常开发过程中,前台向后台传递参数一般是json或者form表单方式,并且最好统一一种传输方式,不建议json+form混合使用,但是由于form表单在数组结构下拼接比较......