3.无重复字符的最长子串_面试题48. 最长不含重复字符的子字符串

116 篇文章 0 订阅
45 篇文章 0 订阅

描述

Given a string, find the length of the longest substring without repeating 》 characters.

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

例子
在这里插入图片描述

思路

  • 使用滑动窗口:[i,j],且只能向前滑
  • 用字典保存已经字符串中出现的字符的上一个出现的下标
  • 使用下标j遍历字符串,如果该字符已经出现在字典中:更新i值(方法1:只能向前滑 i=max(i, dict[s[j]]+1) 方法2:如果该字符上一个在字符串中的下标>=i,则i=dict[s[j]]+1,否则不变),更新最大长度res=max(res, j-i+1),同时在字典中填入s[j]在字符串中出现的最新下标

答案

  • java
class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length()==0) return 0;
        //数组保存比字典更快
        int[] map = new int[128];
        //避免第一个字符的下标0时不好弄
        Arrays.fill(map, -1);
        int i=0;
        int max = 0;
        for(int j=0; j<s.length(); j++) {
            char c = s.charAt(j);
            //找到正确的i
            if(map[c]>-1){
                i = Math.max(i, map[c]+1);
            }

            map[c]=j;
            max = Math.max(max, j-i+1);       
        }
       
        return max;

    }
}
//原始做法
	class Solution {
		    public int lengthOfLongestSubstring(String s) {
		        if(s.length()==0) return 0;
		        Map<Character, Integer> map = new HashMap<>();
		        int[] res = new int[s.length()];
		        res[0]=1;
		        map.put(s.charAt(0),0);
		        int i=0,j=1;
		        int max = 1;
		        for(j=1; j<s.length(); j++) {
		            char c = s.charAt(j);
		  
		            if(map.containsKey(c)==false){
		                res[j]=res[j-1]+1;
		            }else{
		                int index = map.get(c);
		                if(index<i) res[j]=res[j-1]+1;
		                else{
		                    i = index+1;
		                    res[j]=j-i+1;
		                    
		                }
		            }
		            map.put(c,j);
		            
		            max = Math.max(max, res[j]);
		            
		        }
		       
		        return max;

		    }
		}
  • python
    def lengthOfLongestSubstring(self, s: str) -> int:
        dic = {}
        i,res=0,0
        for j in range(len(s)):
            if s[j] in dic:
                if dic[s[j]]>=i:
                    i = dic[s[j]]+1


            dic[s[j]]=j
            res = max(res,j-i+1)

        return res
  • c++
int lengthOfLongestSubstring(string s) {
        vector<int> v(256,-1);//使用数组,因为c++可以将字符当int使用
        int i=0,res=0;
        for (int j=0; j<s.size(); j++)
        { 
            if (v[s[j]]>-1)
                i=max(i,v[s[j]]+1);
            v[s[j]]=j;
            res = max(res,j-i+1);
        }
        /*
        map<char,int> dict; //使用字典
        int i=0,res=0;
        for (int j=0; j<s.size(); j++)
        {
            if (dict.find(s[j])!=dict.end())
                i = max(i,dict[s[j]]+1);
            
            #if (dict.find(s[j]) != dict.end()) 方法2
             #   if (dict[s[j]]>=i)
              #      i = dict[s[j]]+1;
                    
            
            dict[s[j]]=j;
            res = max(res, j-i+1);
        
            
        }
        */
        return res;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值