最大不重复子串

package jvm;

import java.util.HashMap;
import java.util.Map;

public class NoRepeatString {

    /**
     * 003-Longest Substring Without Repeating Characters(最长非重复子字符串)
     * 
     * @param s
     *            输入字符串
     * @return 最大非重复子串长度
     */
    // 可以处理所有的UTF-8字符
    public int lengthOfLongestSubstring2(String s) {
        // 字符串输入不合法
        if (s == null) {
            return 0;
        }
        // 当前处理的开始位置
        int start = 0;
        // 记录到的最大非重复子串长度
        int result = 0;
        String finalRe="";
        int max=0;
        
        // 访问标记,记录最新一次访问的字符和位置
        Map<Character, Integer> map = new HashMap<Character, Integer>(
                s.length());
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i); // 如果字符已经出现过(在标记开位置算起),就重新标记start
            if (map.containsKey(ch) && map.get(ch) >= start) {
                start = map.get(ch) + 1;

            } // 如果没有出现过就求最大的非重复子串的长度   
            else {
                int tm=i - start + 1;
                if(tm>result){//继续增加
                    max=i;
                }
                result = Math.max(result,tm);
            }
            // 更新访问记录
            map.put(ch, i);
        }
        System.out.println(s.substring(max-result+1,max+1));
        return result;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        NoRepeatString lnp = new NoRepeatString();
        String str = "abca123deab";
        int result;
        result = lnp.lengthOfLongestSubstring2(str);

        System.out.println("result=" + result);
    }

}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值