无重复字符的最长字符串
这题个人思路:使用滑动窗口算法,滑动窗口一般用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题,左指针右指针一开始指向字符串开头,通过循环,右指针向字符串右边移动,并使用Map记录每个字符所在的索引下标,当发现map内存在某字符索引下标(说明出现重复字符串),将左指针进行右移,右移动位置为map内存在重复字符位置的下一字符(即该重复字符的下一字符)索引与当前左指针所在位置索引的较大一方(因为abba,第一次b重复,左指针指向索引为2的位置,但是又遇到a重复,“map内存在字符位置的下一字符”会将左指针指向索引1的位置,这样导致左指针向右移动了,是不对的,所以要跟当前左指针进行比较,取较大的一方),至于长度在右指针进行一次移动就进行一次最大长度记录,记录每次右指针减去左指针(索引从0开始,长度需要加1)的长度与上一次记录的比较取最大值,更新最大长度记录即可
class Solution {
//使用滑动窗口
public int lengthOfLongestSubstring(String s) {
//左指针
int start=0;
//记录长度
int length=0;
Map<Character,Integer> map=new HashMap<Character,Integer>();
for(int i=0;i<s.length();i++){
if(map.get(s.charAt(i))==null){
//更新当前字符串索引
map.put(s.charAt(i),i);
}else{
//将左节点指向上一个相同的节点下一节点
start=Math.max(start,map.get(s.charAt(i))+1);
//更新索引
map.put(s.charAt(i),i);
}
length=Math.max(length,i-start+1);
}
return length;
}
}
LeetCode耗时较短解法
class Solution {
public int lengthOfLongestSubstring(String s) {
char[] chars = s.toCharArray();
int max = 0;
boolean[] has = new boolean[128];
for (int l = 0,r = 0;r < chars.length;r++){
while (has[chars[r]]){
has[chars[l]] =false;
l++;
}
has[chars[r]] = true;
max = Math.max(max,r-l+1);
}
return max;
}
}
通过boolean值来判断是否重复