3.Longest Substring Without Repeating Characters

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

最简单的解决方式,逐渐遍历

time:o(n^2)

space:o(n)

 public int lengthOfLongestSubstring(String s) {
        int len=s.length();
        int result=0;
        
        for(int i=0;i<len;i++){
            HashSet<Character> set=new HashSet<Character>();
            for(int j=i;j<len;j++){
                if(set.contains(s.charAt(j)))
                    break;
                else
                    set.add(s.charAt(j));
            }
            if(result<set.size())
                result=set.size();
            if(result>len-i)
                break;
        }
        
        return result;
    }



改进一点:

time: o(n)

space: o(n)

将每个字符及其顺序保存在map中,循环遍历,保留2个指针,一个指针指向当前位置i,一个指向开始保证从开始字符开始到当前字符没有出现过重复的j;若当前字符在之前出现过,则更新j,j应该是j和当前第i个字符在之前出现的位置的最大值;

public int lengthOfLongestSubstring(String s) {
        if(s==null||s.length()==0)
            return 0;
        int max=1;
        HashMap<Character,Integer> map=new HashMap<Character,Integer>();
        for(int i=0,j=0;i<s.length();i++){
            if(map.containsKey(s.charAt(i))){
                if(j<(map.get(s.charAt(i))+1))
                    j=map.get(s.charAt(i))+1;
            }
            map.put(s.charAt(i),i);
            if(max<(i-j+1))
                max=i-j+1;
        }
        return max;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值