97.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package main
  2. func isInterleaveSlow(s1 string, s2 string, s3 string) bool {
  3. l := []int{len(s1), len(s2)} // Backtracking is rather slow...
  4. if l[0]+l[1] != len(s3) {
  5. return false
  6. }
  7. var st Stack = make([]int, 0)
  8. i := make([]int, 3)
  9. s := []string{s1, s2}
  10. for j := 0; i[2] < len(s3); {
  11. for ; j < 2; j++ {
  12. if i[j] < l[j] && s[j][i[j]] == s3[i[2]] {
  13. st.Push(j)
  14. i[j]++
  15. i[2], j = i[2]+1, 0
  16. break
  17. }
  18. }
  19. if j == 2 {
  20. if len(st) == 0 {
  21. return false
  22. }
  23. t := st.Pop().(int)
  24. i[t]--
  25. i[2], j = i[2]-1, t+1
  26. }
  27. }
  28. return true
  29. }
  30. func isInterleave(s1 string, s2 string, s3 string) bool {
  31. l1, l2, l3 := len(s1), len(s2), len(s3)
  32. switch {
  33. case l1+l2 != l3:
  34. return false
  35. case l1 == 0:
  36. return s2 == s3
  37. case l2 == 0:
  38. return s1 == s3
  39. }
  40. dp := make([][]bool, l1+1)
  41. for i := range dp {
  42. dp[i] = make([]bool, l2+1)
  43. if i == 0 {
  44. dp[0][0] = true
  45. } else {
  46. dp[i][0] = dp[i-1][0] && s1[i-1] == s3[i-1]
  47. }
  48. }
  49. for i := 1; i <= l2; i++ {
  50. if !dp[0][i-1] {
  51. break
  52. }
  53. dp[0][i] = s2[i-1] == s3[i-1]
  54. }
  55. for i1 := 1; i1 <= l1; i1++ {
  56. for i2 := 1; i2 <= l2; i2++ {
  57. dp[i1][i2] = (dp[i1-1][i2] && s1[i1-1] == s3[i1+i2-1]) ||
  58. (dp[i1][i2-1] && s2[i2-1] == s3[i1+i2-1])
  59. }
  60. }
  61. return dp[l1][l2]
  62. }
  63. // func main() {
  64. // println(isInterleave("aabcc", "dbbca", "aadbbcbcac"), true)
  65. // println(isInterleave("aabcc", "dbbca", "aadbbbaccc"), false)
  66. // println(isInterleave("a", "b", "a"), false)
  67. // }