
如果是最长子序列,题目就变得很容易。定义一个集合,往中间扔元素,出现重复,取出即可。
方法一:
//在[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(); } }