433.minimum-genetic-mutation.go 796 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. func minMutation(start string, end string, bank []string) int {
  2. src, dst := -1, -1
  3. for i := range bank {
  4. if bank[i] == start {
  5. src = i
  6. } else if bank[i] == end {
  7. dst = i
  8. }
  9. }
  10. if dst == -1 {
  11. return -1
  12. } else if src == dst {
  13. return 0
  14. }
  15. if src == -1 {
  16. bank = append(bank, start)
  17. src = len(bank) - 1
  18. }
  19. n := len(bank)
  20. dist := make([]int, n)
  21. queue := []int{src}
  22. for len(queue) != 0 { // BFS
  23. cur := queue[0]
  24. queue = queue[1:]
  25. for i := 0; i < n; i++ {
  26. if i != cur && dist[i] == 0 && isMutable(bank[cur], bank[i]) {
  27. dist[i] = dist[cur] + 1
  28. queue = append(queue, i)
  29. }
  30. }
  31. if dist[dst] != 0 {
  32. return dist[dst]
  33. }
  34. }
  35. return -1
  36. }
  37. func isMutable(a, b string) bool {
  38. cnt := 0
  39. for i := range a {
  40. if a[i] != b[i] {
  41. cnt++
  42. }
  43. }
  44. return cnt == 1
  45. }