Longest Substring Without Repeating Characters (最长无重复字符的子串)

本文介绍了一种算法,用于查找给定字符串中最长的无重复字符子串。通过使用HashMap来跟踪字符及其索引,算法能有效地解决这个问题。

 

     思路:

     比如 : "dvdfzxd"字符串,我要求他的最长无重复字符的子串。

     可以知道的,一定要从开头遍历到结尾。

     这样,从第一个开始,一直读,直到最后一个,如果读到的字符与之前的重复了,

     那么前面部分就可以看成一个符合要求的子串,记录它的长度。那么接下来就是跳过

     刚重复的字符,以它的下一个节点为起点,重新计算一个新的子串的长度。

     比如这里,遍历到第3个元素d时,与第一个d重复,那么记录,子串长度2,从v开始

     就算新的子串的长度。

     

 

    思路是这样,但是怎么知道之前的字符重复过了?

    HashMap能够很好的帮我们解决。

    用它来存储<字符,小标> 。

 

    但是,"abba"这种情况,该怎么解决了?

   当我们读到第2个a是,明显他们之间还有其他的重复字符。

   可以通过设置一个起点变量,来表示现在计算的子串的起点,同时如果重复,则每次都更新为

    最新的小标。

 

    综上,得到代码:

   

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        HashMap<Character , Integer> map = new HashMap<> ();
        int sum = 0;
        int max = 0;
        int start = 0;
        for(int i = 0 ; i < s.length() ; i++) {
            char c = s.charAt(i);
            if(map.containsKey(c)) {
                int idx = map.get(c);
                //如果重复的元素在新子串内
                if(idx >= start) {
                    //更新为最新的下标
                    map.put(c,i);
                    //最新的无重复元素的子串则是去掉第一个相同的元素
                    sum = i - idx;
                    //新子串的起点
                    start = idx + 1;
                } else {
                    //更新节点为最新的位置
                    map.put(c ,i);
                    sum++;
                } 
            } else {
                map.put(c , i);
                sum++;
            }
            max = Math.max(sum , max);
        }
        return max;
    }
}

 

基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值