zoukankan      html  css  js  c++  java
  • Leetcode: 87. Scramble String

    Description

    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.

    思路

    • 递归
    • 使用一个hash表来判断两个字符串的字符是否相同,若不同,直接返回false
    • 由于不知道左右子树从哪里划分,所以循环从1-len来划分左右子树,注意判断两个串的两种情况

    代码

    class Solution {
    public:
        bool isScramble(string s1, string s2) {
            if(s1 == s2) return true;
            return helper(s1, s2);
        }
        
        bool helper(string s1, string s2){
            if(s1 == s2) return true;
            vector<int> count(26, 0);
            int len = s1.size();
            for(int i = 0; i < len; ++i){
                count[s1[i] - 'a']++;
                count[s2[i] - 'a']--;
            }
            
            for(int i = 0; i < 26; ++i)
                if(count[i]) return false;
            
            for(int i = 1; i < len; ++i){
                
                if(helper(s1.substr(0, i), s2.substr(0, i)) && helper(s1.substr(i, len - i), s2.substr(i, len - i)) || helper(s1.substr(0, i), s2.substr(len - i, i)) && helper(s1.substr(i, len - i), s2.substr(0, len - i)))
                    return true;
            }
            
            return false;
        }
    };
    
  • 相关阅读:
    H5新增属性02
    h5新增属性
    javascript基础
    多列布局和弹性盒模型详解
    边框图片+盒子倒影
    CSS新增边框属性
    css3选择器
    css3基础
    h5新增-2
    h5新增
  • 原文地址:https://www.cnblogs.com/lengender-12/p/7016233.html
Copyright © 2011-2022 走看看