Leecode03——最长字符串

难度:挺难的,做了很多次才做出来

个人不足:一开始没有考虑到遇到重复字符X之后,开始计算距离位置要 从X之后一个开始

当然 所用 方法是HashMap,是一条可行之路

思路:

01

距离为当前读取字符串位置,和开始位置start

开始位置start会出现在哪呢 ?   就是上一个和读取字符 相同的后一个

所以每次遇到都需要修改start指针   比如 abgcbdefc

当读到c时,start开始在 b后面一个[2],当遇到c  在[3]位置已经有了c,

那么比较的就是  上一次start和此时与读取字符串X相同的上一个字符后一个的大小——选择大的

02

将字符依次保持入哈希表中,(将已读取 的k值的   v设为同一个)

每次都要将字符 与字符在字符串中的位置  加入HashMap中  因hashMap会 保持key的不重复。

03计算距离

代码:

class Solution {
    public int lengthOfLongestSubstring(String s) {
       Map<Character,Integer>map = new HashMap();
        HashMap<Character,Integer> hash=new HashMap<>();
        //String s="pwwkew";//abba
        char[] strToChar=s.toCharArray();
        int res=0;
        int start=0;
        for (int i = 0; i <strToChar.length ; i++) {

            if(hash.containsKey(strToChar[i])){
                //如果哈希表存在某元素x
                /*res=Math.max(res,i-start);*///求开始计算位置  与  i的距离
                //start=hash.get(strToChar[i])+1;//既然到这一步 说明有重复,所以start会变化
                start=Math.max(start,hash.get(strToChar[i])+1);
            }

            hash.put(strToChar[i],i);//后续一直加  则需要不断加1

            res=Math.max(res,i-start+1);
        }

        return res;

    }
}
if( hash.containsKey(s.charAt(i) ) ){
      //有重复  就计算距离  那么如何求距离呢
      //start=hash.get(s.charAt(i) )+1;//这里为什么要+1  呢 因为后面一步会更新i的值  i对应的key会是最新的,所以要将上一个start进一位  否则将会包含两个同样的字符

      //如果重复字符之间包括了另外一对重复字符 那么稍远的一组  的start应该还要为最大的那个   如
      //abba   到最后一个a时, start应该要为最大的位置  即在b  而不能回到a  ——————0
           start=Math.max(start,hash.get(s.charAt(i) )+1);
       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值