WANG LH , Research & Development

Longest Substring Without Repeating Characters

2016.11.21 14:07
package com.sea.leetcode;

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

/**
 * Created by Kings on 2016/11/19.
 * 问题描述:
 * 返回一个给定的字符串的最长子字符串的长度。例如:
 * "Hello"  --->输出:3
 * 解题思路:
 * (1)用两个for循环去遍历所有子符串,将其长度放到list中,最后遍历一遍list取出最大值,即为最大长度。
 * 该方法的时间复杂度是O(log(n^2)),慢,不能通过leetcode测试。
 * (2)这个问题其实O(N)算法就够了,记录重复字符串的位置,然后相减得到一个长度,跟最大长度比较。当遍历一遍字符串时,
 * 最大值就出来了。
 *
 */
public class LongestSubstring {
    public int lengthOfLongestSubstring(String s) {
        //Transform string to char array
        char[] carr = s.toCharArray();
        int carrLength = carr.length;
        int maxSubStrLength = 0;
        int subStrLength;
        int lastDupPosition = 0;

        //Use hash map to store each character
        Map<Character, Integer> characterMap = new HashMap<Character, Integer>();
        for (int i = 0; i < carrLength; i++) {
            Integer position = characterMap.get(carr[i]);
            if (position != null && position >= lastDupPosition) {
                lastDupPosition = position + 1;
            }
            subStrLength = i - lastDupPosition + 1;
            characterMap.put(carr[i], i);
            if (subStrLength > maxSubStrLength) {
                maxSubStrLength = subStrLength;
            }
        }
        return maxSubStrLength;
    }

    public static void main(String[] args) {
        String str = "aaa";

        System.out.println(str.length());
        LongestSubstring longestSubstring = new LongestSubstring();
        System.out.println(new Date().getTime());
        int time = longestSubstring.lengthOfLongestSubstring(str);
        System.out.println(new Date().getTime());
        System.out.println(time);
    }
}