JAVA113 Leecode 3 无重复字符的最长字串
3无重复字符的最长字串
先想思路,看题解,对照题解思路一不一样,很一样直接开始写,没思路直接看题解
i:找到元素的hashmap的key的value,通过value定位到key i=位置开始的地方
res:返回的长度,=初始值res 0,和此时遍历到的字符串第j个-i i是初始值是-1 如果没有找到元素hashmap中,那么此时没有重复字符res=res,当前字符次序j --1=j+1 如果找到元素hashmap中,那么i=hashmap中此元素的value res=老res 和 此时遍历次序J-找到元素位置i的 最大值 此时遍历到的次序j 就是字符串中第二次出现的重复字符串的位置,如果后续还可以遍历j 那么如果没找到 res=老res,j老j+1 -i 比大小 较大值

i没更新
abacdeja
| s | j | i | hashmap | res | 
|---|---|---|---|---|
| 0 | -1 | 0 | ||
| if map.containsKey(s.charAt(j)) | ||||
| i=math.max(i,map.get(s.charAt(j))) | res=math.max(res,j-i) | |||
| a | 0 | -1 | a 0 | res=math.max(0,0–1)=1 | 
| b | 1 | -1 | a 0 b 1 | res=math.max(1,1–1)=2 | 
| a | 2 | i=math.max(i=-1,map.get(s.charAt(j)=a))=0)=0 | a 2 b 1 | res=math.max(res=2,j-i=2-0=2)=2 | 
| c | 3 | 0 | a2 b1 c3 | res= | 
| d | 4 | 0 | a2 b1 c3 d4 | res=Math.max(res=3,j-i=4-0=4)=4 | 
| e | 5 | 0 | a2 b1 c3 d4 e5 | res=Math.max(res=4,j-i=5-0=5)=5 | 
| j | 6 | 0 | a2 b1 c3 d4 e5 j6 | res=Math.max(res=5,j-i=6-0=6)=6 | 
| a | 7 | i=Math.max(i=0,map.get(s.charAt(j)=a)=2)=2 | a7 b1 c3 d4 e5 j6 | res=Math.max(res=6,j-i=7-2=5)=6 | 
OK

ababca
if(map.containsKey(s.charAt(j)))
i=Math.max(i,map.get(s.charAt(j)))
res=Math.max(res,j-i)
| s | j | i | hashmap | res | 
|---|---|---|---|---|
| 0 | -1 | 0 | ||
| a | 0 | 没找到 -1 | a 0 | res=Math.max(0,j-i=0–1=1)=1 | 
| b | 1 | 没找到 -1 | a 0 b 1 | res=Math.max(res=1,j-i=1–1=2)=2 | 
| a | 2 | map.containsKey(s.charAt(j)=a)=true i=Math.max(i=-1,map.get(s.charAt(j)=a)=0)=0 | a2 b1 | res=Math.max(res=2,j-i=2-0=2)=2 | 
| b | 3 | map.containsKey(s.charAt(j)=b)=true i=Math.max(i=0,map.get(s.charAt(j)=b)=1)=1 | a2 b3 | res=Math.max(res=2,j-i=3-1=2)=2 | 
| c | 4 | map.containsKey(s.charAt(j)=c)=false i=1 | a2 b3 c4 | res=Math.max(res=2.j-i=4-1=3)=3 | 
| a | 5 | map.containsKey(s.charAt(j)=a)=true i=(i=1,map.get(s.charAt(j)=a)=2)=2 | a5 b3 c4 | res=Math.max(3,j-i=5-2=3)=3 | 
ababca
为什么j遍历的时候不会减第一个i
可以 如果I没被赋值 就是第一个I 修正:第一个赋值后,没被赋值
如果I被赋值第二次,第二个重复,前面已经有重复的了,没重复复的字符串要从这里开始找,j-i 从这里开始
import java.util.HashMap;
import java.util.Map;public class Solution {public int lengthOfLongestSubstring(String s) {Map<Character,Integer> map=new HashMap<>();//定义hashmap//定义i=-1 hashmap中被找到元素的value 如果没又找到 i=-1 res=0 返回的长度int i=-1 ;int res=0;int length=s.length();//s的长度//开始遍历字符串for(int j=0;j<length;j++){//如果找到字符串hashmap中 修正 找到字符 那么更新i的值 i=老的位置 和 新的位置之间的 修正 老的值 和 新的值之间的较大值 新的值等于此时遍历发现元素在hashmap中的value 存入 老的值 得到的res//已经存入,此时以新的值进行计算res 哪个大 哪个长if (map.containsKey(s.charAt(j))){i=Math.max(i,map.get(s.charAt(j)));//比较旧的i和新发现的i元素的位置在hashmap中 修正 j元素 更新i=较大的值 旧的时代已经过去 res 已经计算过//旧的i已经有 新的i 前面已经有重复的元素了 已经有重复的字符串了 所以从新的I开始计算长度 原先的已经过去了}//更新hashmapmap.put(s.charAt(j),j);res=Math.max(res,j-i);//随时以新的I出现的位置进行计算,老的i如果没变,就一直算,如果变了,证明找到重复的了又 当前遍历到的元素与hashmap中有重复 有重复字符串,为啥不存新的,还存老的//新的话不是从 到老的就是重复的, 从老的开始计算,那么后续j增加遍历 不是包含了两个重复元素//Liru abacsj 此时i=0 遍历到 a 2的位置 但是i还是等于0 因为hashmap中存的a 是0 此时 hashmap a 2 b 1 res=1,2,2=2 c 3 i=0 hashmap a2 b1 c3 res=2,3-0=3//从后续开始 从hashmap中原有后面一个开始到当前}
return res;}
}

class Solution {public int lengthOfLongestSubstring(String s) {//初始化hashmapHashMap<Character,Integer> map=new HashMap<>();//定义int i=-1; int res=0;int length=s.length();//遍历sfor(int j=0;j<length;j++){//如果找到元素if(map.containsKey(s.charAt(j))){//i定义 重置I 从当前I开始计算i=Math.max(i,map.get(s.charAt(j)));//取最大值,老的新的,为啥不能直接赋值,把找到元素的value直接赋给i,后续发现的value不永远比前面大吗?absba 后面发现的value不比前面大 后面是1 前面是0 res=j-i=2 i=1 res=j-i=4-1=3 如果直接赋值 那么此时res内包含重复元素 b i=1 刚好避免了两个重复元素}//放入hashmap 进行更新//hashmap重复元素动态更新value值//需要再理解下 这里动态更新的意义map.put(s.charAt(j),j);res=Math.max(res,j-i);}return res;}
}
动态更新后,原有值的value改变,如果下次遍历,发现含有相同元素,i就变为当前value ,如果不动态更新,那么res就会统计到两个字符串相同。
226.翻转二叉树

root
先想思路,看题解,对照题解思路一不一样,很一样直接开始写,没思路直接看题解
思路:root根不变,r.left 变到r.right 层层遍历 r.right=r.left 每一层使用数组暂时存储
