From 7de5964d2a446c3035dd002a4ae81e69df0d4de0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E9=87=8C?= Date: Fri, 6 Dec 2019 17:04:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=AA=E5=BF=83=E7=AE=97=E6=B3=95=E6=B1=82?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../02.BF\347\256\227\346\263\225.go" | 40 ++++++++++++++++++- .../04.Trie\346\240\221.go" | 2 + .../char_test.go" | 11 ++++- ...02\346\234\200\345\244\247\345\200\274.go" | 39 ++++++++++++++++++ .../test_test.go" | 13 ++++++ 5 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 "11.\344\270\262\347\273\223\346\236\204/04.Trie\346\240\221.go" create mode 100644 "21.\350\264\252\345\277\203\346\200\235\346\203\263/01.\346\261\202\346\234\200\345\244\247\345\200\274.go" create mode 100644 "21.\350\264\252\345\277\203\346\200\235\346\203\263/test_test.go" diff --git "a/11.\344\270\262\347\273\223\346\236\204/02.BF\347\256\227\346\263\225.go" "b/11.\344\270\262\347\273\223\346\236\204/02.BF\347\256\227\346\263\225.go" index 091a4e0..6ab3c25 100644 --- "a/11.\344\270\262\347\273\223\346\236\204/02.BF\347\256\227\346\263\225.go" +++ "b/11.\344\270\262\347\273\223\346\236\204/02.BF\347\256\227\346\263\225.go" @@ -8,7 +8,9 @@ BF算法,即简单匹配算法,也称暴力算法(brute-force) */ package main -import "fmt" +import ( + "fmt" +) //s是主串, t子串 //返回子串出现在主串的位置,如果未匹配到则返回-1 @@ -32,6 +34,42 @@ func BFSearch(s, t string) int { } return -1 } + +//BF算法Brute Force暴力匹配算法,又叫朴素匹配算法 +func BF(s, t string) int { + n, m := 0, 0 //申请二个指针, n是s主串的指针, m是t模式串的指针 + for n < len(s) && m < len(t) { + if s[n] == t[m] { //判断指针位置的字符是否相等,如果相等则指针向前移动 + n ++ + m ++ + } else {//否则主串位置回到上次匹配位置的前一位, 子串位置回到0位置, + n = n - m + 1 + m = 0 + } + } + if m >= len(t) {//m指针移动大于等于子串长度,说明匹配成功 + return n-len(t) //返回n指针减去子串t的长度就是匹配子串的开始位置 + } + return -1 //否则匹配不成功 +} + +func Bfs(s, t string) int { + n, m := 0, 0 + for n < len(s) && m < len(t) { + if s[n] == t[m] { + n ++ + m ++ + } else { + n = n - m + 1 + m = 0 + } + } + if m >= len(t) { + return n - len(t) + } + return -1 +} func main() { fmt.Println(BFSearch("aabbcc", "abb")) + fmt.Println(BFS("aabbcc", "abb")) } diff --git "a/11.\344\270\262\347\273\223\346\236\204/04.Trie\346\240\221.go" "b/11.\344\270\262\347\273\223\346\236\204/04.Trie\346\240\221.go" new file mode 100644 index 0000000..3d09986 --- /dev/null +++ "b/11.\344\270\262\347\273\223\346\236\204/04.Trie\346\240\221.go" @@ -0,0 +1,2 @@ +package main +//Trie树,一种多叉树, 也称前缀树,字典树. diff --git "a/11.\344\270\262\347\273\223\346\236\204/char_test.go" "b/11.\344\270\262\347\273\223\346\236\204/char_test.go" index 3e2ec22..d0587c1 100644 --- "a/11.\344\270\262\347\273\223\346\236\204/char_test.go" +++ "b/11.\344\270\262\347\273\223\346\236\204/char_test.go" @@ -1,6 +1,9 @@ package main -import "testing" +import ( + "github.com/yezihack/algo/00.src" + "testing" +) func TestBFSearch(t *testing.T) { tests := []struct { @@ -36,3 +39,9 @@ func TestBFSearch(t *testing.T) { } } } + +func TestBFS(t *testing.T) { + src.Asset(1, t, 2, Bfs("abcdefg", "cde")) + src.Asset(2, t, 0, Bfs("abcdefg", "abc")) + src.Asset(3, t, 5, Bfs("abcdefg", "fg")) +} \ No newline at end of file diff --git "a/21.\350\264\252\345\277\203\346\200\235\346\203\263/01.\346\261\202\346\234\200\345\244\247\345\200\274.go" "b/21.\350\264\252\345\277\203\346\200\235\346\203\263/01.\346\261\202\346\234\200\345\244\247\345\200\274.go" new file mode 100644 index 0000000..95d76f6 --- /dev/null +++ "b/21.\350\264\252\345\277\203\346\200\235\346\203\263/01.\346\261\202\346\234\200\345\244\247\345\200\274.go" @@ -0,0 +1,39 @@ +package _1_贪心思想 + +import ( + "strconv" +) + +//问题描述: 给你一个整数 n,使得从 n 中删除 k 个数字之后的数字最大。 + +//如果 1432219 整数, 删除3个数, 得到4329最大值 + +//使用贪心算法求得,时间复杂度O(n*m) +func GetMaxNumber(n, count int) int { + //先将数字转整形数组 + s := strconv.Itoa(int(n)) + b := make([]int, len(s)) + for k, v := range s {//转换成数字数组 + b[k], _ = strconv.Atoi(string(v)) + } + for i := 0; i < count; i ++ { + min := b[0] + k := 0 + for key, v := range b { + if v < min {//查找最小值 + min = v//最小值 + k = key //记录下标 + } + } + if k >= 0 { + b = append(b[:k], b[k+1:]...)//最小值从下标中删除掉 + } + } + //数字数组转换成整数 + result := "" + for i := 0; i < len(b); i++ { + result += strconv.Itoa(b[i]) + } + v, _ := strconv.Atoi(result) + return v +} diff --git "a/21.\350\264\252\345\277\203\346\200\235\346\203\263/test_test.go" "b/21.\350\264\252\345\277\203\346\200\235\346\203\263/test_test.go" new file mode 100644 index 0000000..6e4164d --- /dev/null +++ "b/21.\350\264\252\345\277\203\346\200\235\346\203\263/test_test.go" @@ -0,0 +1,13 @@ +package _1_贪心思想 + +import ( + "github.com/yezihack/algo/00.src" + "testing" +) + +func TestGetMaxNumber(t *testing.T) { + src.Asset(1, t, 4329, GetMaxNumber(1432219, 3)) + src.Asset(2, t, 439, GetMaxNumber(1432219, 4)) + src.Asset(3, t, 49, GetMaxNumber(1432219, 5)) + src.Asset(4, t, 21, GetMaxNumber(111121, 4)) +}