力扣 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();
    }
}

 

posted @ 2019-03-18 16:40  路在脚下丶  阅读(433)  评论(0编辑  收藏  举报