赞
踩
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
简单来说就是 当第 k 个字符对应无重复字符的结束位置为rk 的时候
那么当我们遍历第k+1个字符的时候,其结束的位置Rk+1 一定比Rk 要大,因为第k+1 与Rk 之间一定是不重复的,而且由于少了第k个字符,所以RK+1 就会比Rk 要大。所以
那么实现的思路就是 用一个HashSet 记录当前最长子串的内容,然后左边为索引i ,右边为Rk,
将Rk内容放入HashSet之前,先判断是否存在元素,如果不存在则右移Rk,如果存在则右移i,并且移除hashSet 中对应的i-1位置的元素
代码实现
- import java.util.HashSet;
- import java.util.Set;
-
- public class TestController {
-
-
- public static void main(String args[]) {
- String example = "abcaddd";
- System.out.println(lengthOfLongestSubstring(example));
- }
-
-
- public static int lengthOfLongestSubstring(String s) {
- Set<Character> aloneItem = new HashSet<>();
- int right = 0;
- int n = s.length();
- int ans = 0;
- for (int left = 0; left < n; left++) {
- if (left != 0) {
- aloneItem.remove(s.charAt(left - 1));
- }
- while (right <= n-1 && !aloneItem.contains(s.charAt(right ))) {
- aloneItem.add(s.charAt(right));
- right++;
- }
- ans = Math.max(ans, right - left );
- }
- return ans;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。