12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- func minMutation(start string, end string, bank []string) int {
- src, dst := -1, -1
- for i := range bank {
- if bank[i] == start {
- src = i
- } else if bank[i] == end {
- dst = i
- }
- }
- if dst == -1 {
- return -1
- } else if src == dst {
- return 0
- }
- if src == -1 {
- bank = append(bank, start)
- src = len(bank) - 1
- }
- n := len(bank)
- dist := make([]int, n)
- queue := []int{src}
- for len(queue) != 0 { // BFS
- cur := queue[0]
- queue = queue[1:]
- for i := 0; i < n; i++ {
- if i != cur && dist[i] == 0 && isMutable(bank[cur], bank[i]) {
- dist[i] = dist[cur] + 1
- queue = append(queue, i)
- }
- }
- if dist[dst] != 0 {
- return dist[dst]
- }
- }
- return -1
- }
- func isMutable(a, b string) bool {
- cnt := 0
- for i := range a {
- if a[i] != b[i] {
- cnt++
- }
- }
- return cnt == 1
- }
|