题目地址:
https://www.lintcode.com/problem/equivalent-strings/description
给定两个字符串
s
s
s和
t
t
t,问它们是否等价。两个字符串等价当且仅当:
1、
s
=
t
s=t
s=t;
2、
s
s
s的前半部分与
t
t
t的前半部分等价并且
s
s
s的后半部分与
t
t
t的后半部分等价;
3、
s
s
s的前半部分与
t
t
t的后半部分等价并且
s
s
s的后半部分与
t
t
t的前半部分等价;
这里的前(后)半部分指的是平均分的情况下的前(后)半部分。题目保证两个字符串长度相等。注意,如果两个字符串长度都是奇数(也就是无法均分),那它们等价规定为完全相等。
直接按照定义来做即可,也即利用递归来做。代码如下:
public class Solution {
/**
* @param s1: a string
* @param s2: a string
* @return: is s1 and s2 are equivalent
*/
public boolean isEquivalentStrings(String s1, String s2) {
// Write your code here
int len = s1.length();
if (len % 2 != 0) {
return s1.equals(s2);
}
if (s1.equals(s2)) {
return true;
}
String s1sub1 = s1.substring(0, len / 2), s1sub2 = s1.substring(len / 2, len);
String s2sub1 = s2.substring(0, len / 2), s2sub2 = s2.substring(len / 2, len);
return isEquivalentStrings(s1sub1, s2sub1) && isEquivalentStrings(s1sub2, s2sub2) || isEquivalentStrings(s1sub1, s2sub2) && isEquivalentStrings(s1sub2, s2sub1);
}
}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn)(可以由 T ( n ) = n + 2 T ( n 2 ) T(n)=n+2T(\frac{n}{2}) T(n)=n+2T(2n)递推得到。equals需要 O ( n ) O(n) O(n)的时间),空间 O ( log n ) O(\log n) O(logn)(递归深度)。