Leetcode解题

3.Longest Substring Without Repeating Characters


[题目连接]https://leetcode.com/problems/longest-substring-without-repeating-characters/hints/


1.暴力解决方法

1.1思路

双重循环,内部循环用于查找前面与正在处理的i相同的元素,如果在i的前面查找到一个下标为j的元素,那么j之前的元素及j以后就不用考虑包含进入结果了,设置index = j+1, 在i之前如果找到一个 与i相同的字符即可跳出这次内部循环查找,下次内部查找循环开始的位置为index。如果j与i位置是不相等的字符串,则记录下j 字符到i 处位置字符的长度,并与上一次的最大max进行比较
代码块语法遵循标准markdown代码,例如:

1.2代码

public class LongestSubstringWithoutRepeating {

    public int solution(String s)
    {
        //暴力解决方法,初始化为max =1,包含第一个字符串
        int index = 0,max = 1,len = s.length();
        if(len==0)
            return 0;
        if(len==1)
            return 1;
        for(int i=1;i<len;++i)
        {
            for(int j=i-1;j>=index;--j)
            {
                if(s.charAt(i)==s.charAt(j)) {
                    index = j + 1;//相等情况下,不考虑更新max
                    //0到index-1是不再需要考虑的元素
                    break;//跳出整个循环语句, 转到处理下一个字符i,前面的不能在博阿凯
                }
                else//不相等情况下如何
                    {
                    if(max<i-j+1)
                        max = i -j +1;
                }
            }

        }
        return max;
    }
 }

2.hashmap记录结构

2.1思路

采用一个hashmap结果记录上次与i字符相同的元素的位置, 比如 abcdbe, 当处理第二个b时,判断hashmap是否包含b了,如果包含,取出第一个b的位置下表j。这样时间复杂度为O(N), 空间复杂度为O(1)

2.2代码

public int solution_2(String s)
    {
        //比上面更加情况
        if(s.length()==0) return 0;
        Map<Character, Integer> map =new HashMap<Character, Integer>();
        int max =0;
        for(int i=0,j=0;i<s.length();++i) {
            if (map.containsKey(s.charAt(i)))
                //j是同一个字符出现的位置前面上面的一点的位置
                //在这里 j是不相等前面的元素
                j = Math.max(j, map.get(s.charAt(i)) + 1);
            //如果存在,求出最大值
            //如果不存在的话,直接put到上面,更新操作,
            map.put(s.charAt(i), i);
            max = Math.max(max, i - j + 1);
        }
         return max;
           }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值