LeetCode3
先说说我的个人思路吧,刷LeetCode 1的时候,我就发现哈希表还是很方便的,所以这道题我就用了哈希表的一个方法:map.containsKey(参数);这个方法可以作为结束内层循环的标志。但是我虽然用的是哈希表,但是用了两层循环才做出来,所以真的是不够的,我认为算法的灵魂是不断向最优算法靠近。写这个算法,我认为最大的收获是对于滑动窗口的使用,真的是很强!
以下是我写的实践代码,仅供参考:
方法一:暴力法
import java.util.HashMap;
import java.util.Map;
public class Test3 {
public static void main(String[] args) {
String s = "pwwkew";
System.out.println("输入的字符串为:"+s);
int num = lengthOfLongestSubstring(s);
System.out.println("不重复最大字串的个数为:"+num);
}
//我用的是暴力法,共两层循环,但是暴力法真的是不够的,时间复杂度就很高,所以我们一定要做优化
public static int lengthOfLongestSubstring(String s) {
int num = 0;
for(int i = 0;i<s.length();i++){
Map<String, Integer> map = new HashMap<>();
for(int j = i;j<s.length();j++) {//注意j=i;
String str = String.valueOf(s.charAt(j));
if (map.containsKey(str)) {//如果该字符在哈希表中,则跳出的当前循环
break;//只要出现重复的值,就终止内层循环,进入外层的下一次循环
}
else {
map.put(str, j);//遇到不重复的字符串就放入哈希表中,哈希表中永远是不重复的字符串
if(num<map.size()){//保证截取到的不重复字符串永远是最大的
num = map.size();
}
}
}
if(map.size()==s.length()){num = s.length();//判断所有的字符串是不是都不一样
break;//如果所给字符串都是不重复的,一次循环后即结束
}
}
return num;
}
}
结果如下:
方法二:滑动窗口
//滑动窗口求解
public static int lengthOfLongestSubstring1(String s){
int num = 0;
Set<Character> set = new HashSet<>();//创建滑动窗口
int j=0,i = 0;
while(i<s.length()&&j<s.length()){
if(!set.contains(s.charAt(j))){
set.add(s.charAt(j++));
num = Math.max(num,j-i);
}
else{
set.remove(s.charAt(i++));
}
}
return num;
}
总结:注释就不怎么写了,这个过程需要自己亲自走一遍
方法三:HashMap优化的滑动窗口
//HashMap优化的滑动窗口
public static int lengthOfLongestSubstring2(String s){
int num = 0;
Map<Character,Integer> map = new HashMap<>();
for(int i = 0,j = 0;j<s.length();j++){
if(map.containsKey(s.charAt(j))){
i = Math.max(map.get(s.charAt(j)),i);
}
num = Math.max(num,j-i+1);
map.put(s.charAt(j),j+1);//切记,哈希表中不会出现相同的String、char等类型的元素
System.out.println("map的怎样变化:"+map);
}
//System.out.println(map);
return num;
}
结果如下:
切记,哈希表中不会出现相同的String、char等类型的元素,所以使用时一定要注意,而且这也是完成该算法至关重要的一步。
请看如下验证:
Map<Character,Integer> map = new HashMap<>();
map.put('a',2);
map.put('a',6);
map.put('b',6);
Map<String,Integer> map1 = new HashMap<>();
map1.put("abc",1);
map1.put("abc",5);
map1.put("aabc",5);
System.out.println("map的集合为:"+map);
System.out.println("map1的集合为:"+map1);