zoukankan      html  css  js  c++  java
  • 力扣 3 :无重复最长子串

    如果是最长子序列,题目就变得很容易。定义一个集合,往中间扔元素,出现重复,取出即可。

    方法一:

    //在[left...right)的区间中是一个没有重复字符的滑动窗口
    //当右边新加一个字符仍然满足,right++,扩大窗口,
    //当右边新加一个字符不满足没有重复字符,记录此时的窗口大小,left++,缩小窗口,恢复窗口是没有重复字符的。
    
     class Solution {
      public static int lengthOfLongestSubstring(String s) {
        boolean[] contain = new boolean[256];
        int n = s.length();
        int left =0 , right = 0, max = 0;
        while(right < n){
            while(right < n && !contain[s.charAt(right)]){
                contain[s.charAt(right)] = true;
                right++;
            }
    
            max = Math.max(max, right - left);
            while(left < n && right < n){
                contain[s.charAt(left)] = false;
                if(s.charAt(left++) == s.charAt(right))  //当找到和右边相等的数字之后,left执行自加运算,右移一位。新的滑动窗口构建出来
                    break;
            }
        }
        return max;
       }
    }
    

     方法二:

    class Solution {
    public int lengthOfLongestSubstring(String s) {
        String temp = "";//临时存放的字符串。用temp来不断寻找新的字串,寻找过程中一旦遇到重复字符,temp即发生更新,让temp记录最新的,abcc这种,出现c重复之后,最新的temp就是""因为并未产生新temp。
        String list = "";//每个阶段最长的连续字串
        for (int i = 0; i < s.length(); i++) {
                /*
                如果在临时字符串中存在,将出现那个位置之前的字符都删除。
                */
            if (temp.contains(s.charAt(i) + "")) {
                int t = temp.indexOf(s.charAt(i));
                //如果t+1位置就和当前的temp长度相当,说明是相邻的情况,也就是temp的最后一个字符,和新字符相同了。
                //如abcc,说明在当前temp=abc 
                //这时候temp需要重置,从s.charAt(i)开始重新计数,即后面程序temp = temp.concat(s.charAt(i) + "")
                if ((t + 1) == temp.length())
                    temp = "";
                //如果不是,如:abcdefgd.我们就需要从d的后面取新子串了 temp = efg (当前temp的长度是上一个temp的,故只到g)
                else
                    temp = temp.substring(t + 1, temp.length());
                temp = temp.concat(s.charAt(i) + "");
            } else {
                temp = temp.concat(s.charAt(i) + "");
            }
            if (list.length() <= temp.length()) {//如果找到一个比现在的长的子串,置换
                list = temp;
            }
        }
        return list.length();
        }
    }
  • 相关阅读:
    span设置宽和高当没有内容的时候也可撑开
    span设置宽和高当没有内容的时候也可以撑开
    块级元素以及内联元素大总结
    内存泄露问题
    Sqlcompletefree
    运用SET ANSI_PADDING OFF创建某个字段为自增列的表,以及插入数据
    Sql Server中通配符
    sql server 2008查询窗口怎么显示行数
    sql server 2008语句中的go有什么用?
    SQL Server 2008 R2[ALTER]列属性修改
  • 原文地址:https://www.cnblogs.com/theWinter/p/10553022.html
Copyright © 2011-2022 走看看