第一题 无重复字符串的最长子串
思路
其实就是在字符串S中 找到没有重复的最长子串的长度 这道题的难点就是在于如何判断最长并且无重复
首先 最长长度 可以使用变量max记录保存
再者 判断有无重复 最简单的方法就是 暴力遍历法 即对于每次找的子串都再次寻找遍历一次 判断是否已有字符 自然 这种方法判断的话 时间复杂度会不是一般的高
当然 算法优化我们慢慢再讨论 最直接的思路就是如此
解法一:暴力法
我们的暴力当然和上述思路不太一样 我们对于是否重复 可以直接利用Map集合key不能重复的特点 然后使用containKey()方法直接进行判断
class Solution {
public static int lengthOfLongestSubstring(String s) {
// 对于S的特殊情况直接返回0
if(s==null || s.length()==0) return 0;
//将S转化为char数组[] 遍历该数组 然后进行判断
char[] charArray = s.toCharArray();int max=1;
Map<Character,Integer> map=new HashMap<>();
//遍历 每次遍历开始就是认定为子串的起始字符
for(int i=0;i< charArray.length;i++){
//每次记录完一次后 需要把map清空
map.clear();
map.put(charArray[i],i); //将第一个字符放入
for(int j=i+1;j< charArray.length;j++){
if(map.containsKey(charArray[j])){ // 利用containKey方法直接判断
if(map.size()>max) max=map.size(); // 判断当前map长度和max进行比较
break;
}else{
map.put(charArray[j],j);
}
}
if(map.size()>max) max=map.size();
}
return max;
}
}