欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Leetcode解题

程序员文章站 2022-05-20 10:56:50
...

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;
           }
相关标签: leetcode解题