一道leetcode上没有的算法题-好串
大哥先看看题
>
PS: leetcode上没有,竟然没有
定义一个字符串是好串,必须满足这个字符串都是有ABC组成的,
并且相邻的字符串不相同
比如BCB是好串,AAC不是好串
现在给你2个好串S,T,长度相同并且都是好串。
你可以将S中的任意字符串改变成[A,B,C]其中一个,但是每一步必须满足S还是好串。求最小的改变次数,使得S变成T。
例子:S=CABC T=CBAC 答案是6CABC-》BABC-》BCBC-》BCAC-》ACAC-》ABAC-》CBAC
package main
import "fmt"func main() {
//a := 0
//fmt.Scan(&a)
//fmt.Printf("%d\n", a)
fmt.Printf("Hello World!\n")
s := "CABC"
t := "CBAC"
println("[最小次数]===========", minNum(s, t))
}
//TODO: 干这道题!!
func minNum(s,t string)(num int){
//CABC-》BABC-》BCBC-》BCAC-》ACAC-》ABAC-》CBAC
//A := 'A'
//B := 'B'
//C := 'C'
//
new_str := getNewStrByABC(s,t,num)
num++
circle_num := 1
for new_str != t {
if num > 100{
break
}
fmt.Println("index==>",num%(len(s)),"new_str==>",new_str, "目标==",t)
fmt.Println()
new_str_2 := getNewStrByABC(new_str,t,circle_num%(len(s)))
if new_str != new_str_2{//如果不相等,才计数
num++
}
new_str = new_str_2
circle_num++
}
return
}
func getNewStrByABC(str, target string,index int)(res string){
res=str
res_arr := []string{"A","B","C"}
str_arr := strings.Split(str, "")
if str[index:] == target[index:]{
fmt.Println("因为两个字符串的从这下标开始后面全部相等,所以直接退出",str,target,index)
return
}
res_str := ""
notLeft := ""
leftIndex := index-1
if leftIndex > 0{
notLeft = str_arr[leftIndex]
}
notSelf := str_arr[index]
notRight := ""
rightIndex := index+1
if rightIndex < len(str_arr) {
notRight = str_arr[rightIndex]
}
for _,v := range res_arr {
if v == notLeft || v == notSelf || v == notRight{
continue
}
//找出唯一的选择
res_str = v
}
//根据下标index替换,如果不为空,则说明可以替换
if res_str != ""{
str_arr[index] = res_str
//合成替换后字符串
res = strings.Join(str_arr, "")
}
return
}
///////////
小黑心声
谢谢各位大哥观看小黑弟弟
小黑感恩戴德
欢迎大哥批评指正小黑
感谢大哥点赞
祝大哥每天快乐
身体健康