leetcode 87. Scramble String DFS深度优先搜索

来源:互联网 发布:Linux如何修改权限 编辑:程序博客网 时间:2024/06/04 18:22

Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.

Below is one possible representation of s1 = “great”:

great
/ \
gr eat
/ \ / \
g r e at
/ \
a t
To scramble the string, we may choose any non-leaf node and swap its two children.

For example, if we choose the node “gr” and swap its two children, it produces a scrambled string “rgeat”.

rgeat
/ \
rg eat
/ \ / \
r g e at
/ \
a t
We say that “rgeat” is a scrambled string of “great”.

Similarly, if we continue to swap the children of nodes “eat” and “at”, it produces a scrambled string “rgtae”.

rgtae
/ \
rg tae
/ \ / \
r g ta e
/ \
t a
We say that “rgtae” is a scrambled string of “great”.

Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.

这道题题意很简单,但是我没有想到深度优先搜索可以这么做,我是网上参考的答案,这个解决方法很漂亮。

代码如下:

public class Solution {    /*     * 暴力求解,这个我就真的想不到了     * */    public boolean isScramble(String s1, String s2)    {        if(s1==s2 || s1.equals(s2))            return true;        int []a=new int[26];        for(int i=0;i<s1.length();i++)            a[s1.charAt(i)-'a']++;        for(int i=0;i<s2.length();i++)            a[s2.charAt(i)-'a']--;        for(int i=0;i<a.length;i++)        {            if(a[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(s1.substring(i), s2.substring(0,s2.length()-i)))                return true;        }        return false;    }}

下面是C++的做法,就是使用DFS深度优先遍历暴力搜索,说实话,我自己想不出来,这是网上看的做法,很棒

代码如下:

#include <iostream>#include <string>#include <vector>using namespace std;class Solution {public:    bool isScramble(string s1, string s2)     {        if (s1 == s2)            return true;        if (s1.length() != s2.length())            return false;        vector<int> count(26,0);        for (int i = 0; i < s1.length(); i++)            count[(int)(s1[i] - 'a')]++;        for (int i = 0; i < s2.length(); i++)            count[(int)(s2[i] - 'a')]--;        for (int i = 0; i < count.size(); i++)        {            if (count[i] != 0)                return false;        }        for (int i = 1; i < s1.length(); i++)        {            if (isScramble(s1.substr(0,i), s2.substr(0,i))             && isScramble(s1.substr(i), s2.substr(i)) )                return true;            if (isScramble(s1.substr(0,i), s2.substr(s2.length()-i))                && isScramble(s1.substr(i), s2.substr(0, s2.length()-i)))                return true;        }        return false;    }};