一、题目链接
https://leetcode.cn/problems/longest-substring-without-repeating-characters/
二、解题思路
三、实施步骤
四、Java程序
import java.util.Arrays;
class Solution {
/**
* 计算给定字符串中不含有重复字符的最长子串的长度
*
* @param s String类型的对象,代表给定字符串
* @return int类型的整数,代表s中不含有重复字符的最长子串的长度
*/
public int lengthOfLongestSubstring(String s) {
int[] lastOccur = new int[128]; // 存储s中每个字符上一次出现的位置
Arrays.fill(lastOccur, -1); // 初始时设置s中每个字符上一次出现的位置为-1,也即未出现
int ans = 0; // s中不含有重复字符的最长子串的长度,初始时为0
int searchFrom = 0; // 搜索窗口的左边界,初始时为0
/* 从左到右,依次遍历s中的每个字符 */
for (int i = 0; i < s.length(); i++) {
char current = s.charAt(i); // 取当前字符current
// 如果current上一次出现的位置大于等于搜索窗口左边界,说明current在窗口中重复出现
// 此时应将搜索窗口左边界更新为current上一次出现位置的后一个位置
// 否则,说明current在搜索窗口中没有重复出现,搜索窗口左边界不变
searchFrom = (lastOccur[current] >= searchFrom ? lastOccur[current] + 1 : searchFrom);
// 如果当前搜索窗口的长度大于ans,则应更新ans,否则ans不变
ans = (i - searchFrom + 1 > ans ? i - searchFrom + 1 : ans);
lastOccur[current] = i; // 用当前位置i更新current上一次出现的位置
}
return ans;
}
}