“一尺之棰,日取其半,万世不竭。”---《庄子.天地》
题目大意:给2个字符串,问s1能否通过Scramble(将其从中间任意一处切开,然后调换位置)操作变成s2。
解题思路:初看之下这道题似乎十分麻烦,先切成2半,再互换,再切。。。但细想之下其实不难发现,不论怎么操作,最后都会将字符串全部切开(然后再互换)。于是,思路就很简单了。
由于切到最后时永远是两个单字符进行判定,而最坏的情况也就是切到了最后,所以用迭代的思想一次进行判定返回true即可。此外还需判断s1,s2长度和内容是否一致(这都不一致那肯定是不可能isScramble的啦)
代码:
public boolean isScramble(String s1, String s2) {
if(s1.equals(s2)) return true;
int[] letter = new int[26];
for(int i=0;i<s1.length();i++){
letter[s1.charAt(i)-'a']++;
letter[s2.charAt(i)-'a']--;
}
for(int i=0;i<26;i++){
if(letter[i]!=0) return false;
}
for(int i=1;i<s1.length();i++){
if(isScramble(s1.substring(0,i),s2.substring(0,i)) && isScramble(s1.substring(i),s2.substring(i))){
return true;
}
if(isScramble(s1.substring(0,i),s2.substring(s2.length()-i)) && isScramble(s2.substring(0,s2.length()-i),s1.substring(i))){
return true;
}
}
return false;
}