Jelajahi Sumber

add 'Count and Say'

tangs 5 tahun lalu
induk
melakukan
e825a64138
1 mengubah file dengan 64 tambahan dan 0 penghapusan
  1. 64 0
      tags/string/countAndSay/main.go

+ 64 - 0
tags/string/countAndSay/main.go

@@ -0,0 +1,64 @@
+package main
+
+import (
+	"fmt"
+	"strconv"
+)
+
+func main() {
+	var n int
+
+	n = 3
+	fmt.Println(countAndSay(n))
+
+	n = 2
+	fmt.Println(countAndSay(n))
+
+	n = 3
+	fmt.Println(countAndSay(n))
+
+	n = 4
+	fmt.Println(countAndSay(n))
+
+	n = 5
+	fmt.Println(countAndSay(n))
+
+	n = 6
+	fmt.Println(countAndSay(n))
+
+	n = 7
+	fmt.Println(countAndSay(n))
+
+	n = 8
+	fmt.Println(countAndSay(n))
+}
+
+func countAndSay(n int) string {
+	if _, ok := store[n]; !ok {
+		for i := 2; i <= n; i++ {
+			store[i] = findSaying(store[i-1])
+		}
+	}
+	return store[n]
+}
+
+var store = map[int]string{
+	1: "1",
+}
+
+func findSaying(s string) string {
+	var count int
+	var cursor = len(s) - 1
+	var res string
+	for i := len(s) - 1; i >= 0; i-- {
+		if s[i] == s[cursor] {
+			count++
+		} else {
+			res = strconv.FormatInt(int64(count), 10) + s[cursor:cursor+1] + res
+			count = 1
+			cursor = i
+		}
+	}
+	res = strconv.FormatInt(int64(count), 10) + s[cursor:cursor+1] + res
+	return res
+}