vlambda博客
学习文章列表

一道leetcode上没有的算法题-好串



大哥先看看题

>
PS: leetcode上没有,竟然没有

定义一个字符串是好串,必须满足这个字符串都是有ABC组成的,

并且相邻的字符串不相同

比如BCB是好串,AAC不是好串
现在给你2个好串S,T,长度相同并且都是好串。
你可以将S中的任意字符串改变成[A,B,C]其中一个,但是每一步必须满足S还是好串。求最小的改变次数,使得S变成T。
例子:S=CABC T=CBAC 答案是6

CABC-》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
}

///////////

小黑心声

谢谢各位大哥观看小黑弟弟
小黑感恩戴德
欢迎大哥批评指正小黑
感谢大哥点赞 

祝大哥每天快乐

身体健康