找Bug 用例

https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof/

func exist(board [][]byte, word string) bool {
	n := len(word)
	r := len(board)
	c := len(board[0])
	if n > r*c {
		return false
	}
	g := func(p, q, a, b int) bool {
		return (p == a && (q-b == 1 || q-b == -1)) || ((p-a == 1 || p-a == -1) && q == b)
	}
	for i := 0; i < n; i++ {
		v := word[i]
		p, q, a, b := -1, -1, -1, -1
		f := false
		for j := 0; j < r; j++ {
			for k := 0; k < c; k++ {
				u := board[j][k]
				if v == u {
					p, q = j, k
					if a != -1 {
						if !g(p, q, a, b) {
							return false
						}
					}
					a, b = p, q
					f = true
					break
				}
			}
		}
		if !f {
			return true
		}
	}
	return true
}

  

func exist(board [][]byte, word string) bool {
	n := len(word)
	r := len(board)
	c := len(board[0])
	if n > r*c {
		return false
	}
	adjoin := func(p, q, a, b int) bool {
		return (p == a && (q-b == 1 || q-b == -1)) || ((p-a == 1 || p-a == -1) && q == b)
	}
	m := map[int][]int{}
	had := func(r, c int) bool {
		_, e := m[r]
		if e {
			for _, v := range m[r] {
				if v == c {
					return true
				}
			}
			m[r] = append(m[r], c)
		} else {
			m[r] = []int{c}
		}
		return false
	}

	for i := 0; i < n; i++ {
		v := word[i]
		p, q, a, b := -1, -1, -1, -1
		hit := false
		for j := 0; j < r; j++ {
			for k := 0; k < c; k++ {
				u := board[j][k]
				if v == u {
					if had(j, k) {
						continue
					}
					p, q = j, k
					if a != -1 {
						if !adjoin(p, q, a, b) {
							return false
						}
					}
					a, b = p, q
					hit = true
					break
				}
			}
			if hit {
				break
			}
		}
		if !hit {
			return false
		}
	}
	return true
}

  

 边界值BUG

func exist(board [][]byte, word string) bool {
	n := len(word)
	r := len(board)
	c := len(board[0])
	if n > r*c {
		return false
	}
	m := map[int][]int{}
	had := func(r, c int, add bool) bool {
		_, e := m[r]
		if e {
			for _, v := range m[r] {
				if v == c {
					return true
				}
			}
			if add {
				m[r] = append(m[r], c)
			}
		} else {
			if add {
				m[r] = []int{c}

			}
		}
		return false
	}

	start := [][]int{}
	v := word[0]
	for j := 0; j < r; j++ {
		for k := 0; k < c; k++ {
			u := board[j][k]
			if v == u {
				start = append(start, []int{j, k})
			}
		}
	}

	for _, p := range start {
		a, b := p[0], p[1]
		ok := false
		if b-1 >= 0 {
			u := board[a][b-1]
			if !had(a, b-1, false) {
				if u == v {
					had(a, b-1, true)
				}
			}
			ok = true
			continue
		}
		if b+1 <= c-1 {
			u := board[a][b+1]
			if !had(a, b+1, false) {
				if u == v {
					had(a, b+1, true)
				}
			}
			ok = true
			continue
		}
		if a-1 >= 0 {
			u := board[a-1][b]
			if !had(a-1, b, false) {
				if u == v {
					had(a-1, b, true)
				}
			}
			ok = true
			continue
		}

		if a+1 <= r-1 {
			u := board[a+1][b]
			if !had(a+1, b, false) {
				if u == v {
					had(a+1, b, true)
				}
			}
			ok = true
			continue
		}
		if !ok {
			return false
		}
	}

	return true
}

  

func exist(board [][]byte, word string) bool {
	n := len(word)
	r := len(board)
	c := len(board[0])
	if n > r*c {
		return false
	}

	m := map[int][]int{}
	had := func(r, c int, add bool) bool {
		_, e := m[r]
		if e {
			for _, v := range m[r] {
				if v == c {
					return true
				}
			}
			if add {
				m[r] = append(m[r], c)
			}
		} else {
			if add {
				m[r] = []int{c}
			}
		}
		return false
	}

	start := [][]int{}
	v := word[0]
	for j := 0; j < r; j++ {
		for k := 0; k < c; k++ {
			u := board[j][k]
			if v == u {
				start = append(start, []int{j, k})
			}
		}
	}
	if len(start) == 0 {
		return false
	}
	for _, p := range start {
		a, b := p[0], p[1]
		ok0 := true
		for i := 1; i < n; i++ {
			v := word[i]
			ok := false
			if b-1 >= 0 {
				u := board[a][b-1]
				if !had(a, b-1, false) {
					if u == v {
						had(a, b-1, true)
						ok = true
						b--
						continue
					}
				}
			}
			if b+1 <= c-1 {
				u := board[a][b+1]
				if !had(a, b+1, false) {
					if u == v {
						had(a, b+1, true)
						ok = true
						b++
						continue
					}
				}
			}
			if a-1 >= 0 {
				u := board[a-1][b]
				if !had(a-1, b, false) {
					if u == v {
						had(a-1, b, true)
						ok = true
						a--
						continue
					}
				}
			}
			if a+1 <= r-1 {
				u := board[a+1][b]
				if !had(a+1, b, false) {
					if u == v {
						had(a+1, b, true)
						ok = true
						a++
						continue
					}
				}
			}
			if !ok {
				ok0 = false
				break
			}
		}
		if ok0 {
			return true
		}
	}

	return false
}

  

 

posted @ 2022-04-22 22:48  papering  阅读(42)  评论(0编辑  收藏  举报