3.无重复字符的最长子串

47 阅读1分钟

3.无重复字符的最长子串

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

public class Problem_0003_LongestSubstringWithoutRepeatingCharacters {
	// 最长子串问题,思路:遍历字符串每个下标位置i,以i为结尾位置往左推,得到每个位置最长无重复子串,然后得到最大值即可。
	/*
	 * 分两种情况(1)、i位置往左推,推不动的地方 (2)、i-1位置往左推,推不动的地方 两种情况求最大值,就是i位置最长的子串
	 */
	public int lengthOfLongestSubstring(String s) {
		if (s == null || s.equals("")) {
			return 0;
		}
		char[] str = s.toCharArray();
		// 字符大小写,数字空格对应的ASCII值都不超过127,值为上次出现的位置
		int[] map = new int[128];
		for (int i = 0; i < 128; i++) {
			map[i] = -1;
		}
		int len = 0;
		// i-1位置结尾的情况下,往左推,推不动的位置是谁,比如 2167891,1的pre为数字2的下标位置
		int pre = -1;
		for (int i = 0; i < str.length; i++) {
			pre = Math.max(map[str[i]], pre);
			int cur = i - pre;
			len = Math.max(len, cur);
			map[str[i]] = i;
		}
		return len;
	}
}

思路:遍历字符串每个下标位置i,以i为结尾位置往左推,得到每个位置最长无重复子串,然后得到最大值即可。

影响最长子串有两个关键位置

  1. i位置元素上次出现的位置
  2. i - 1 位置结尾往左推了多远

看代码思路不清晰,画个图就一目了然了。