• 无重复字符的最长子串


    题目传送门:

    解决方法:滑动窗口

    解题步骤:

    步骤1:

    • 首先定义两个指针fast和low,fast表示窗口的左边,low表示窗口的右边,初始状态均置为0
    • 定义dis变量用来记录当前窗口的大小,res记录最终的结果,
    • 定义数组arr记录每一个字符出现的最后位置,初始化为-1

    步骤2:

    • low指针依次向后移动,每次判断low指针指向的字符上一次出现的位置是否在fast和low之间
      • 如果不在,更新该字符最后出现的位置,窗口的大小增1
      • 如果在即出现了重复的字符,首先计算当前窗口的大小,判断是否需要更当前窗口的大小;然后更新fast指针(让该指针指向重复字符上一次出现的下一个位置);最后更新窗口的大小和low指针指向的字符最后一次出现的位置。

    代码:

    //测试代码
    public class Main{
        public static void main(String[] args) {
            String s = "abcabcbb";
            System.out.println(new Solution().lengthOfLongestSubstring(s));
        }
    }
    
    class Solution {
        public int lengthOfLongestSubstring(String s) {
            if(s.length() == 0){
                return 0;
            }
    
            int[] arr = new int[255];
            int fast = 0, low = 0;      //fast表示窗口的起始位置,low表示末尾位置
            int dis = 0, res = 0;      //dis记录当前窗口的大小,res记录最终的结果
    
            for(int i = 0; i < arr.length; ++i){
                arr[i] = -1;
            }
    
            //low指针一直向后进行移动
            while(low < s.length()){
                //如果当前字符未在窗口内出现,修改该字符最后出现位置的,然后将出口的大小加1
                if(arr[s.charAt(low)] < fast){
                    arr[s.charAt(low)] = low;
                    ++dis;
                } else {       //如果出现,更新结果,并修改窗口的起始位置,同时更新窗口的大小
                    if(dis > res){
                        res = dis;
                    }
                    fast = arr[s.charAt(low)] + 1;
                    dis = low - fast + 1;
                    arr[s.charAt(low)] = low;
                }
    
                ++low;
            }
            if(dis > res){
                res = dis;
            }
    
            return res;
        }
    }
    
  • 相关阅读:
    机器学习之支持向量机
    C++ 踩的坑
    C++ 虚析构函数
    Linux 离线安装软件
    samba配置问题
    字符串相关函数总结
    printf(),类型修饰符
    getopt()和getopt_long()用法
    关于GDB使用
    关于C语言宏定义 使用do{ xxxx }while()
  • 原文地址:https://www.cnblogs.com/zcxhaha/p/11172750.html
Copyright © 2020-2023  润新知