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