题目:
给定一个字符串如“aabbccabcacbca” 要求删除所有重复的字符,只返回abc
分析:
滑动窗口,
1,通过窗口找到包含所有唯一字符的最小子串区间,
2,找到这个区间ascii码最小的字符,找到的这个字符保留,删除之后所有与他相同的字符
3,重复上述步骤,直到删除所有重复字符
代码:
package main
import(
"fmt"
// "math"
)
func process(str string) (result string){
if len(str)==1{
return string(str[0])
}
m:=make(map[string]int)
for _,v:= range(str){
m[string(v)]++
}
left:=0
right:=0
tmp:=""
for right<len(str){
m[string(str[right])]-=1
// fmt.Println(left,right,m)
if m[string(str[right])]==0{
for left<= right && string(str[left]) != minascii(m){
left++
// fmt.Println(left)
}
// fmt.Println(left)
result=string(str[left])
newstr:=""
//注意这里一定要从原始字符串0开始,因为acsii小的字符可能在右边,
//为了防止误删,每次只删ascii最小的,其他均保留
for i:=0;i<len(str);i++{
if str[i]!=str[left]{
newstr=newstr+string(str[i])
}
}
// fmt.Println(newstr)
tmp=process(newstr)
// fmt.Printf("tmpppppppppppppppppp %v\n",tmp)
}
right++
}
result=result+tmp
return result
}
func minascii(m map[string]int)string{
char:="z"
minascii:=byte(char[0])
for k,_ := range(m){
if byte(k[0])<minascii{
minascii= byte(k[0])
}
}
return string(minascii)
}
func main(){
str:="bbaccbeaafggccacbd"
fmt.Println(process(str))
}