LintCode 384 最长无重复字符的子串 渣渣学算法系列

描述

给定一个字符串,请找出其中无重复字符的最长子字符串。
样例
样例 1:
输入: “abcabcbb”
输出: 3
解释: 最长子串是 “abc”.
样例 2:
输入: “bbbbb”
输出: 1
解释: 最长子串是 “b”.
挑战
O(n) 时间复杂度

解法:

  • i ~ k 没有重复字符
  • i ~ k +1 有重复字符
  • i +1 ~ k 一定没有重复字符
  • 所以j可以从k开始
    同向双指针,需要记录两个指针中每个字符出现的次数(均<=1)
    只要右指针下一个字符出现次数=0,就可以向右移动
Java代码实现
public class Solution {
    /**
     * @param s: a string
     * @return: an integer
     */
     public static int lengthOfLongestSubstring(String ss) {
        if(ss == null || ss.length() == 0){
            return 0;
        }
        char[] s = ss.toCharArray();
        int [] count = new int[128];
        int left = 0;
        int maxCount = 0;
        int tcount=0;
        int right = 0;
        for(left = 0; left<s.length ;left++ ){
            if(left >= 1){
                count[s[left-1]-'\0']--;
                tcount--;
            }

            for(right = left + tcount  ; right < s.length ; right ++){
                if(count[s[right]-'\0']==0){
                    count[s[right]-'\0']++;
                    tcount++;
                }
                else if(count[s[right]-'\0']==1){

                    break;
                }
                if(tcount>maxCount){
                    maxCount = tcount;
                }
            }
        }
        return maxCount;
    }
}

截至2019/03/01

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值