无重复字符串的最长字串-字符串
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
思路1 以每个字符为结尾的最长自窜(类似于动态规划)利用上一个最长自窜的位置+上一次出现本字符的位置pi 分为两种就好 pi<li pi>=pi
public int lengthOfLongestSubstring(String s) {
if (s == null) return 0;
char[] chars = s.toCharArray();
if (chars.length == 0) return 0;
// 用来保存每一个字符上一次出现的位置
int[] prevIdxes = new int[128];
for (int i = 0; i < prevIdxes.length; i++) {
prevIdxes[i] = -1;
}
prevIdxes[chars[0]] = 0;
// 以i - 1位置字符结尾的最长不重复字符串的开始索引(最左索引)
int li = 0;
int max = 1;
for (int i = 1; i < chars.length; i++) {
// i位置字符上一次出现的位置
int pi = prevIdxes[chars[i]];
if (li <= pi) {
li = pi + 1;
}
// 存储这个字符出现的位置
prevIdxes[chars[i]] = i;
// 求出最长不重复子串的长度
max = Math.max(max, i - li + 1);
}
return max;
}
public int lengthOfLongestSubstring2(String s) {
if (s == null) return 0;
char[] chars = s.toCharArray();
if (chars.length == 0) return 0;
// 用来保存每一个字符上一次出现的位置
Map<Character, Integer> prevIdxes = new HashMap<>();
prevIdxes.put(chars[0], 0);
// 以i - 1位置字符结尾的最长不重复字符串的开始索引(最左索引)
int li = 0;
int max = 1;
for (int i = 1; i < chars.length; i++) {
// i位置字符上一次出现的位置
Integer pi = prevIdxes.get(chars[i]);
if (pi != null && li <= pi) {
li = pi + 1;
}
// 存储这个字符出现的位置
prevIdxes.put(chars[i], i);
// 求出最长不重复子串的长度
max = Math.max(max, i - li + 1);
}
return max;
}
浙公网安备 33010602011771号