• 最长不重复字符的子串(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 }
  • 相关阅读:
    h5 与原生 app 交互的原理
    软件公司各种角色透视图
    软件公司各种角色透视图
    软件公司各种角色透视图
    3大原则让你的编程之路越走越顺
    LeetCode[39]: 组合总和
    20190826
    Oracle介绍
    Welcome to Giyber Blog
    清醒
  • 原文地址:https://www.cnblogs.com/xuzhiyuan/p/7606169.html
Copyright © 2020-2023  润新知