给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:

输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:

输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

package dance;

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

public class Demo1 {

	public static void main(String[] args) {

		int len = lengthOfLongestSubstring("abcabcbb");// ""

		System.out.println(len);
	}

	public static int lengthOfLongestSubstring(String s) {
		/*
		 * 输入: "abcabcbb" 输出: 3 
		 * 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
		 */

		// 最长字串长度
		int maxLen = 0;

		// 滑动窗口起始指针位置
		int viewStart = 0;
		
		// 滑动窗口结束指针位置
		int viewEnd = 0;

		// 字符及其最后出现位置的散列表
		Map<Character, Integer> chTable = new HashMap<Character, Integer>();
		
		
		for (int i = 0; i < s.length(); i++) {
			char ch = s.charAt(i);
		
			// 字符最后出现索引下标
			if (chTable.get(ch) != null) {
				// 出现过
				if(chTable.get(ch) >= viewStart) {
					/*
					 * 这种情况不应该更换起始位置
					 * 	k		I			
					 * 	k	w	w	k	e	w
					 */
					viewStart = chTable.get(ch) + 1;
				}
			}
			
			// 尾指针移动
			viewEnd = i;

			// 字符最后出现索引下标存储
			chTable.put(ch, i);
			
			// 视口长度
			int viewLen = viewEnd - viewStart + 1;

			// 维护最大长度
			maxLen = maxLen > viewLen ? maxLen : viewLen;
		}

		return maxLen;
	}

}

你可能感兴趣的:(LeetCode)