87.go 655 B

1234567891011121314151617181920212223242526272829303132333435
  1. package main
  2. func isScramble(s1 string, s2 string) bool {
  3. if s1 == s2 {
  4. return true
  5. }
  6. cnt := make([]int, 26)
  7. for i := range s1 {
  8. cnt[s1[i]-'a']++
  9. }
  10. for i := range s2 {
  11. cnt[s2[i]-'a']--
  12. }
  13. for i := range cnt {
  14. if cnt[i] != 0 {
  15. return false
  16. }
  17. }
  18. n := len(s1)
  19. for i := 1; i < n; i++ { // Can be spilt at any position!!!
  20. if isScramble(s1[:i], s2[:i]) && isScramble(s1[i:], s2[i:]) {
  21. return true
  22. }
  23. // Swap sub tree
  24. if isScramble(s1[:i], s2[n-i:]) && isScramble(s1[i:], s2[:n-i]) {
  25. return true
  26. }
  27. }
  28. return false
  29. }
  30. // func main() {
  31. // println(isScramble("great", "rgeat"))
  32. // println(isScramble("abcde", "caebd"))
  33. // }