又tm一天cfunclongestPalindrome(sstring)string{varn=len(s)vardp=make([][]bool,n)varmax=1varstartintfori:=0;i<n;i++{dp[i]=make([]bool,n)}forj:=0;j<n;j++{fori:=0;i<=j;i++{ifj-i<2{dp[i][j]=(s[i]==s[j])}else{dp[i][j]=(dp[i+1][j-1]&&s[i]==s[j])}ifdp[i][j]&&j-i+1>max{max=j-i+1start=i}}}returns[start:start+max]}注意到两个循环,必须要在保证判断dp[i][j]时,dp[i+1][j+1]里这个区间所有的元素都已经正确赋值,一开始写的循环“aaaaa”,一直报错,就是因为判断s[4]的时候,dp[0][3]虽然true了,但是dp[1][4]还是false,还有个问题就是之前的循环一个元素和两个字符比如“aa”这样的回文子串判断不出来,原因也是遍历不到位的原因,dp[i+1][j-1]还是原来那个元素,并没有正确赋值。
mb,错了一天,D了一天bug,真爽。脑子秀逗的感觉。funclengthOfLongestSubstring(sstring)int{varstart,end=0,0varmax=0varhashMap=make(map[byte]int,100)//hashMap[s[0]]=0//t,ok:=hashMap[s[end+1]]for;end<len(s);{t,ok:=hashMap[s[end]]ifok&&t>=start{//这里之前没有判断t,导致在map中,start之前位置可能有重复字符,导致失败。ifmax<end-start{max=end-start}start=hashMap[s[end]]+1}else{hashMap[s[end]]=endend++}}ifmax<end-start{//如果整个字符串一个重复字符没有,那么end=lenl(s)直接退出,不会执行循环里的长度判断max=end-start}returnmax}又写了一个切片的funclengthOfLongestSubstring(sstring)int{varmax=0varlocations=[128]int{0}fori:=0;i<len(s);i++{//切片下标为字母,所以一开始没设置为-1时,下面读的locations可能为0,等于了start,但实际第一个元素还没有存入locations[s[i]]=-1}n:=len(s)varstart,end=0,0for;end<len(s);end++{iflocations[s[end]]>=start{start=locations[s[end]]+1}ifend-start+1>max{max=end-start+1ifmax>=n-start{break}}locations[s[end]]=end}returnmax}
短路求值:作为“&&”和“||”操作数表达式,这些表达式在进行求值时,只要最终的结果已经确定真或假,求值过程便告终,这就是短路求值。因此可以利用左边的表达式来作为递归结束的判断条件。因此递归的表达式就在右边了。使用&&,表示两边都为真,才为真,左边为假,右边就没用了。因此在不断递归时,直到左边为假时,才不执行右边。因此在第一次进行右边的判断时,就进入递归的调用。funcSum_Solution(nint)int{varffunc(ret*int,nint)boolf=func(ret*int,nint)bool{*ret+=nreturnn>0&&f(ret,n-1)}varsumintf(&sum,n)returnsum}
funcfindRepeatNumber(nums[]int)int{n:=len(nums)fori:=0;i<n;i++{fori!=nums[i]{//交换之后的新数还是从这开始,继续判断这个数是否需要交换,直到这个num[i]正确if(nums[i]==nums[nums[i]]){//非第一次出现returnnums[i]}else{//第一次出现x:=nums[i]nums[i]=nums[x]nums[x]=x}}}return0}//没搞明白这个原地置换的原理用map或者排序做吧。funcfindRepeatNumber(nums[]int)int{varmapV=make(map[int]int)fori:=0;i<len(nums);i++{_,ok:=mapV[nums[i]]ifok{returnnums[i]}else{mapV[nums[i]]=i}}return-1}
funcaddTwoNumbers(l1*ListNode,l2*ListNode)*ListNode{ifl1==nil||l2==nil{returnnil}head:=&ListNode{Val:0,Next:nil}current:=headcarry:=0forl1!=nil||l2!=nil{varx,yintifl1==nil{x=0}else{x=l1.Val}ifl2==nil{y=0}else{y=l2.Val}current.Next=&ListNode{Val:(x+y+carry)%10,Next:nil}current=current.Nextcarry=(x+y+carry)/10ifl1!=nil{l1=l1.Next}ifl2!=nil{l2=l2.Next}}ifcarry>0{current.Next=&ListNode{Val:carry,Next:nil}}returnhead.Next}总结carry代表进位,一位一位加即可,若其中一条链到底,均设置为0,直到两条都到底,结束,最后跳出循环再判断最后一位是否还有进位,有进位再添加一个节点记录。
packageleetcode//hash算法,visited采用hashmap存储,每遍历一个数,就检查target-num的差是否在hashmap存在了,存在则返回,不存在则记录,继续遍历functwoSum(nums[]int,targetint)[]int{varvisited=make(map[int]int,len(nums))fori,num:=rangenums{sub:=target-numifj,ok:=visited[sub];ok{return[]int{i,j}}else{visited[num]=i}}returnnil}//穷搜,固定一个数num,搜索剩余数+num?=targetfunctwoSum2(nums[]int,targetint)[]int{fori,num:=rangenums{forj:=i+1;j<len(nums);j++{ifnum+nums[j]==target{return[]int{i,j}}}}returnnil}