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)
- // }
|