问题描述
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
就是找出一个字符串的最长子串
解决思路: 使用两个标记来维护一个hashset,让一个标记遍历整个字符串在这里使用charAt函数来进行确定字符串里字符的值。两个标记选择其一向前移动。同样是维护一个HashSet, 正常情况下移动runner标记,如果没有出现重复则继续移动右标记,如果发现重复字符,则说明当前标记中的串已经不满足要求,继续移动有标记不可能得到更好的结果,此时移动左标记,直到不再有重复字符为止,中间跳过的这些串中不会有更好的结果,因为他们不是重复就是更短。每个元素访问不超过一遍,因此时间复杂度为O(2*n)=O(n),是线性算法。空间复杂度为HashSet的size,也是O(n). 代码如下:
public class Solution { public int lengthOfLongestSubstring(String s) { if(s==null||s.length()==0) return 0; HashSet<Character>set = new HashSet<Character>(); int max=0; int walker=0; int runner=0; while(runner<s.length()){ if (set.contains(s.charAt(runner))) { if(max<runner-walker) max=runner-walker; while(s.charAt(runner)!=s.charAt(walker)) { set.remove(s.charAt(walker)); walker++; } walker++; } else { set.add(s.charAt(runner)); } runner++; } max = Math.max(max,runner-walker); return max; } }
时间: 2024-10-12 10:43:33