leetcode Scramble String 解题思路

 

 

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

 

posted @ 2016-04-12 18:39  luikimfai  Views(536)  Comments(0Edit  收藏  举报