zoukankan      html  css  js  c++  java
  • 最长不重复字符的子串(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 }
  • 相关阅读:
    css中margin-left与left的区别
    Python文件和目录模块介绍:glob、shutil、ConfigParser
    [ Python入门教程 ] Python文件基本操作_os模块
    使用Pyinstaller转换.py文件为.exe可执行程序
    Windows命令行打开常用界面
    如何做好性能测试_流程篇
    Windows查看指定端口是否占用和查看进程
    ‘操作无法完成 ,因为其中的文件夹或文件已在另一程序中打开’问题解决
    bat脚本基础教程
    vi编辑器常用命令
  • 原文地址:https://www.cnblogs.com/xuzhiyuan/p/7606169.html
Copyright © 2011-2022 走看看