Longest Substring Without Repeating Characters

package leetcode.xuyi;

import org.junit.Test;

/**
 * Created by ethan on 2015/5/4.
 */
public class LongestSubstringWithoutRepeatingCharacters {

    // 记下字串的起始位置,当遇到substring中有的字符的时候,起始位置+1
    // 如何确定是当前字符已经在之前的substring中出现:可一个长度为26的数组
    public int lengthOfLongestSubstring(String s) {
        int longest_start = 0;
        int longest_end = 0;
        int start = 0;
        int end = 0;
        int length = 0;
        // 数组记录当前substring中出现在的字符
        // 值考虑a - z的情况
        boolean[] exist = new boolean[256];
        while(end<s.length()){
            int char_index = (int)s.charAt(end);
            if(!exist[char_index]){
                exist[char_index] = true;
                if (end-start+1>length){
                    length = end-start+1;
                    // 这部分在本体中没有意义但是若要取出最长字串的时候会有用。
//                    longest_start = start;
//                    longest_end = end;
                }
                end ++;
            }else{
                int start_char_index = (int)s.charAt(start);
                exist[start_char_index] = false;
                start++;
            }
        }
        System.out.println(longest_start + " " + longest_end);
        return length;
    }

    // 用boolean[] 记录是否出现过的效率太低,可以用int[] 记录下数组的之前出现的位置与start比较即可,这样获得更高的效率
    public int lengthOfLongestSubstring2(String s){
        int start = 0;
        int length = 0;
        int[] loc = new int[256];
        for (int i=0; i<loc.length; i++)
            loc[i] = -1;
        // i代表当前substring的end位置的index
        for (int i=0; i<s.length(); i++){
            if(loc[s.charAt(i)]>=start){
                start = loc[s.charAt(i)]+1;
            }else if(length < i-start+1){
                length = i-start+1;
            }
            // 保存字符最新出现的位置
            loc[s.charAt(i)] = i;
        }
        return length;
    }

    @Test
    public void test3() {
        System.out.println(lengthOfLongestSubstring2("abcabcbb"));
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值