| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | 
							- package main
 
- func isInterleaveSlow(s1 string, s2 string, s3 string) bool {
 
- 	l := []int{len(s1), len(s2)} // Backtracking is rather slow...
 
- 	if l[0]+l[1] != len(s3) {
 
- 		return false
 
- 	}
 
- 	var st Stack = make([]int, 0)
 
- 	i := make([]int, 3)
 
- 	s := []string{s1, s2}
 
- 	for j := 0; i[2] < len(s3); {
 
- 		for ; j < 2; j++ {
 
- 			if i[j] < l[j] && s[j][i[j]] == s3[i[2]] {
 
- 				st.Push(j)
 
- 				i[j]++
 
- 				i[2], j = i[2]+1, 0
 
- 				break
 
- 			}
 
- 		}
 
- 		if j == 2 {
 
- 			if len(st) == 0 {
 
- 				return false
 
- 			}
 
- 			t := st.Pop().(int)
 
- 			i[t]--
 
- 			i[2], j = i[2]-1, t+1
 
- 		}
 
- 	}
 
- 	return true
 
- }
 
- func isInterleave(s1 string, s2 string, s3 string) bool {
 
- 	l1, l2, l3 := len(s1), len(s2), len(s3)
 
- 	switch {
 
- 	case l1+l2 != l3:
 
- 		return false
 
- 	case l1 == 0:
 
- 		return s2 == s3
 
- 	case l2 == 0:
 
- 		return s1 == s3
 
- 	}
 
- 	dp := make([][]bool, l1+1)
 
- 	for i := range dp {
 
- 		dp[i] = make([]bool, l2+1)
 
- 		if i == 0 {
 
- 			dp[0][0] = true
 
- 		} else {
 
- 			dp[i][0] = dp[i-1][0] && s1[i-1] == s3[i-1]
 
- 		}
 
- 	}
 
- 	for i := 1; i <= l2; i++ {
 
- 		if !dp[0][i-1] {
 
- 			break
 
- 		}
 
- 		dp[0][i] = s2[i-1] == s3[i-1]
 
- 	}
 
- 	for i1 := 1; i1 <= l1; i1++ {
 
- 		for i2 := 1; i2 <= l2; i2++ {
 
- 			dp[i1][i2] = (dp[i1-1][i2] && s1[i1-1] == s3[i1+i2-1]) ||
 
- 				(dp[i1][i2-1] && s2[i2-1] == s3[i1+i2-1])
 
- 		}
 
- 	}
 
- 	return dp[l1][l2]
 
- }
 
- // func main() {
 
- // 	println(isInterleave("aabcc", "dbbca", "aadbbcbcac"), true)
 
- // 	println(isInterleave("aabcc", "dbbca", "aadbbbaccc"), false)
 
- // 	println(isInterleave("a", "b", "a"), false)
 
- // }
 
 
  |