最长不重复字符的子串(Leetcode Longest Substring Without Repeating Characters)

Posted xzy不会飞的地板流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长不重复字符的子串(Leetcode Longest Substring Without Repeating Characters)相关的知识,希望对你有一定的参考价值。

问题:

给定一个字符串,找到最长子串的长度,而不重复字符。

例子:

给定"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 }

 

 






以上是关于最长不重复字符的子串(Leetcode Longest Substring Without Repeating Characters)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode刷题3.无重复字符的最长子串

[LeetCode]剑指 Offer 48. 最长不含重复字符的子字符串

[LeetCode]剑指 Offer 48. 最长不含重复字符的子字符串

[LeetCode] 3. Longest Substring Without Repeating Characters 最长无重复字符的子串

LeetCode-滑动窗口最长不含重复字符的子字符串

LeetCode 3. 无重复字符的最长子串(动态规划,HashMap,Java)