一群大雁往南 飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。
具体的:
1.大雁发出的完整叫声为"quack",因为有多只大雁同一时间嘎嘎作响,所以字符串中可能会混合多个"quack"。
2.大雁会依次完整发出"quack",即字符串中’q’ ,‘u’, ‘a’, ‘c’, ‘k’ 这5个字母按顺序完整存在才能计数为一只大雁。如果不完整或者没有按顺序则不予计数。
3.如果字符串不是由’q’, ‘u’, ‘a’, ‘c’, ‘k’ 字符组合而成,或者没有找到一只大雁,请返回-1。
输入描述
一个字符串,包含大雁quack的叫声。1 <= 字符串长度 <= 1000,字符串中的字符只有’q’, ‘u’, ‘a’, ‘c’, ‘k’
输出描述
大雁的数量
示例1:
输入:quackquack
输出:1
一只大雁叫了两声
示例2:
输入:quqackuack
输出:2
至少两只大雁各叫了一声quack
示例3:
输入:quackquook
输出:-1
给出的字符串不是quack的有效组合
实例3
输入:quqackuackquack
输出:2
思路:大雁会依次完整发出q u a c k五个字符,因此个字符技术首先要满足countQ > countU > countA > countC > countK,另外因为quackquack算一只大雁叫两声,因此连续的quack,不管出现多少次,都可算做一只大雁叫了多次,判断条件为q的索引位置+4等于k的位置,因此拿出q和k的位置记录,过滤符合这样条件的,剩余的需要多只大雁发出。
golang实现
func StringQuack(in string) int { var q, k []int var countU, countA, countC int for i, v := range in { switch string(v) { case "q": q = append(q, i) case "u": if countU < len(q) { countU++ } case "a": if countA < countU { countA++ } case "c": if countC < countA { countC++ } case "k": if countC > 0 { k = append(k, i) countU-- countA-- countC-- } default: return -1 } //fmt.Println("Switch countQ, countU, countA, countC, countK", string(v), q, countU, countA, countC, k) } var size = len(q) if len(k) < size { size = len(k) } var res int var flag bool for i := 0; i < size; i++ { if q[i]+4 == k[i] { flag = true continue } res++ } if flag && res == 0 { res++ } if res == 0 { return -1 } fmt.Println("countQ, countU, countA, countC, countK", q, countU, countA, countC, k, res) return res}
测试代码
func TestStringQuack(t *testing.T) { type args struct { in string } tests := []struct { name string args args want int }{ { name: "test1 quack", args: args{ in: "quack", }, want: 1, }, { name: "test2 quackquack", args: args{ in: "quackquack", }, want: 1, }, { name: "test3 quqackuack", args: args{ in: "quqackuack", }, want: 2, }, { name: "test4 quackquook", args: args{ in: "quackquook", }, want: -1, }, { name: "test5 quqackuackquack", args: args{ in: "quqackuackquack", }, want: 2, }, { name: "test6 qququaauqccauqkkcauqqkcauuqkcaaukccakkck", args: args{ in: "qququaauqccauqkkcauqqkcauuqkcaaukccakkck", }, want: 8, }, { name: "test7 ququackackqakcu", args: args{ in: "ququackackqakcu", }, want: 2, }, { name: "test8 quacqkuac", args: args{ in: "quacqkuac", }, want: 1, }, { name: "test9 quacquackquack", args: args{ in: "quacquackquack", }, want: 2, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := StringQuack(tt.args.in); got != tt.want { t.Errorf("StringQuack() = %v, want %v", got, tt.want) } }) }}