问题:
给定一个字符串,找到最长子串的长度,而不重复字符。
例子:
给定"abcabcbb"
的答案是"abc"
,长度是3。
给定"bbbbb"
的答案是"b"
,长度为1。
给定"pwwkew"
的答案是"wke"
,长度为3.请注意,答案必须是子字符串,"pwke"
是子序列,而不是子字符串。
解法一(超时):
1 class Solution { 2 public int lengthOfLongestSubstring(String s) { 3 4 5 if(s.length()==0){ 6 7 return 0; 8 9 } 10 11 int max=1; 12 int temp=1; 13 14 for(int i=0;i<s.length();i++){ 15 16 temp=1; 17 18 for(int j=i+1;j<s.length();j++){ 19 20 if(!((s.substring(i,j)).contains(s.substring(j,j+1)))){ 21 22 temp++; 23 24 }else{ 25 26 break; 27 28 } 29 30 } 31 32 if(max<temp){ 33 34 max=temp; 35 36 } 37 38 if(max>(s.length()-i)){ 39 40 break; 41 42 } 43 44 } 45 46 return max; 47 48 } 49 50 }
解法二(通过):set集合中存放的是从i到j个未重复的字符;若第j个元素重复,则将set集合中重i开始删除直到将重复的元素也删除;若第j个元素没有重复则将j所对应的字符放入set集合中,
并且将从i~j的长度j+1-i与以前记录的最大位重复子串长度max比较,即max=Math.max(j+1-i,max);然后将j++;
1 class Solution { 2 public int lengthOfLongestSubstring(String s) { 3 4 int i=0; 5 int j=0; 6 int n=s.length(); 7 int max=0;//最大子串长度 8 9 HashSet<Character> set=new HashSet<Character>();//存放未重复的子串 10 11 while(i<n&&j<n){ 12 13 //如果j对应的字符未重复,则将j对应的字符放入set中,并且将从i~j的长度j+1-i与以前记录的最大位重复子串长度max比较,即max=Math.max(j+1-i,max);然后将j++;
14 15 if(!(set.contains(s.charAt(j)))){ 16 17 set.add(s.charAt(j++)); 18 max=Math.max(max,j-i); 19 20 }else{ 21 22 //若从j对应的字符与set中的元素重复,则将重复的元素之前的包括重复的元素删除 23 24 set.remove(s.charAt(i++)); 25 26 } 27 28 } 29 30 return max; 31 } 32 33 }