用java 实现 Longest Substring Without Repeating Characters 无重复字符的最长子串(leetCode 算法)

无重复字符的最长子串(Longest Substring Without Repeating Characters)是LeetCode上一个非常经典的滑动窗口问题。这个问题要求我们找到给定字符串中没有重复字符的最长子串的长度。

下面是一个使用Java实现的解决方案,它使用了滑动窗口和哈希集合来跟踪当前窗口内的字符:

import java.util.HashSet;
import java.util.Set;

public class LongestSubstringWithoutRepeatingCharacters {
    public static int lengthOfLongestSubstring(String s) {
        // 创建一个HashSet来存储字符
        Set<Character> set = new HashSet<>();
        int n = s.length(), ans = 0, i = 0, j = 0;

        // 使用滑动窗口遍历字符串
        while (i < n && j < n) {
            // 如果set中不包含s.charAt(j),则将字符添加到set中,并移动右指针j
            if (!set.contains(s.charAt(j))){
                set.add(s.charAt(j++));
                ans = Math.max(ans, j - i);
            }
            else {
                // 如果遇到了重复字符,则移除左指针i指向的字符,并移动左指针i
                set.remove(s.charAt(i++));
            }
        }

        return ans;
    }

    public static void main(String[] args) {
        // 示例调用
        String input = "abcabcbb";
        System.out.println("Length of the longest substring without repeating characters: " 
                           + lengthOfLongestSubstring(input));
    }
}

这段代码实现了lengthOfLongestSubstring方法,该方法接收一个字符串s作为参数,并返回最长非重复子串的长度。我们使用了两个指针ij来表示滑动窗口的左右边界,并且使用了一个HashSet来存储当前窗口内的字符。当遇到一个新的字符时,如果这个字符不在set中,我们就将其加入set并更新答案;如果这个字符已经在set中存在,这意味着遇到了重复字符,因此我们需要移动左指针i,并且从set中移除相应的字符,直到窗口内不再有重复字符为止。

main方法中,我们给出了一段测试代码来展示如何调用lengthOfLongestSubstring方法。在这个例子中,输入字符串为"abcabcbb",预期输出应该是3,因为最长的无重复字符的子串是"abc"。

你可能感兴趣的:(算法,java,leetcode)