https://leetcode.com/problems/scramble-string/
首先递归,或说是递推是最容易想到的:
F(s1(i,j), s2(i,j)) = F(s1(i,k),s2(i,k)) && F(s1(j-k,j),s2((j-k,j))
|| F(s1(i,k),s2(j-k,j)) && F(s1(j-k,j),s2(i,k)) i<k<j;
图解:
F(s1, s2) = F(s11,s21) && F(s12,s22)
|| F(s11,s22) && F(s12,s21) i<k<j;
简单的用递归编程会超时, 因为有太多重复的计算, 因此, 我们希望能够减少重复,即每个状态只计算一次, 通常, 这样的状态会用一个矩阵来记录状态。对于这个问题, 一个简单的矩阵不够用, 需要多个矩阵。
先看一些简单的, 是或不是scramble string的状态:
总结出规律: 对角有一组满足,都是true, 就是scramble string。
再看一个3个字母的演化情况:
当维度再一步扩大的时候, 还要综合考虑前面数个表的组合判断,这里我偷懒不画, 原理其实是一样的。
代码地址:
https://github.com/LKF10051/LeetCode/blob/master/LeetCode/scramble_string.cpp
时间: 2024-10-05 18:54:10