mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-04 16:12:47 +08:00
36 lines
814 B
Go
36 lines
814 B
Go
package leetcode
|
|
|
|
func isInterleave(s1 string, s2 string, s3 string) bool {
|
|
if len(s1)+len(s2) != len(s3) {
|
|
return false
|
|
}
|
|
visited := make(map[int]bool)
|
|
return dfs(s1, s2, s3, 0, 0, visited)
|
|
}
|
|
|
|
func dfs(s1, s2, s3 string, p1, p2 int, visited map[int]bool) bool {
|
|
if p1+p2 == len(s3) {
|
|
return true
|
|
}
|
|
if _, ok := visited[(p1*len(s3))+p2]; ok {
|
|
return false
|
|
}
|
|
visited[(p1*len(s3))+p2] = true
|
|
var match1, match2 bool
|
|
if p1 < len(s1) && s3[p1+p2] == s1[p1] {
|
|
match1 = true
|
|
}
|
|
if p2 < len(s2) && s3[p1+p2] == s2[p2] {
|
|
match2 = true
|
|
}
|
|
if match1 && match2 {
|
|
return dfs(s1, s2, s3, p1+1, p2, visited) || dfs(s1, s2, s3, p1, p2+1, visited)
|
|
} else if match1 {
|
|
return dfs(s1, s2, s3, p1+1, p2, visited)
|
|
} else if match2 {
|
|
return dfs(s1, s2, s3, p1, p2+1, visited)
|
|
} else {
|
|
return false
|
|
}
|
|
}
|