在Java中,解决“最长无重复子串”的问题是一个常见的算法题。这个问题可以通过滑动窗口的方式来解决,具体步骤如下:
- 使用两个指针表示字符串中的某个子串(或窗口)的左右端点,初始时两个指针都指向字符串的开头。
- 移动右指针以扩展窗口,直到窗口中包含一个重复字符为止。
- 记录当前无重复子串的长度,并与之前记录的最大长度进行比较,更新最大长度。
- 移动左指针以缩小窗口,直到窗口中不包含重复字符为止。
- 重复步骤2-4,直到右指针到达字符串的末尾。
以下是一个Java实现的示例代码:
import java.util.HashMap;
public class Solution {
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
HashMap<Character, Integer> map = new HashMap<>();
int maxLength = 0;
int left = 0, right = 0;
for (; right < s.length(); right++) {
char currentChar = s.charAt(right);
if (map.containsKey(currentChar)) {
// 如果当前字符已经存在于map中,则移动左指针
left = Math.max(left, map.get(currentChar) + 1);
}
// 更新当前字符的最后出现位置
map.put(currentChar, right);
// 计算当前无重复子串的长度,并更新最大长度
maxLength = Math.max(maxLength, right - left + 1);
}
return maxLength;
}
public static void main(String[] args) {
Solution solution = new Solution();
String input = "abcabcbb";
int result = solution.lengthOfLongestSubstring(input);
System.out.println(result);
}
}