87. Scramble String打乱字符串

题目描述

给出一个字符串,建立一个二叉树用于存储它,除了叶子节点,其他节点的左右孩子都是非空子树。如下图
二叉树
我们采用以下方法打乱此树:从这棵树中选择一个非叶子节点,例如gr节点,我们交换它的左右子树得到新节点”rg”。向上合并得到新的字符串:
新二叉树
我们说”rgeat”是”great”的乱序字符串。
问题: 给定两个同等长度字符串s1和s2,判断s2是不是s1的乱序字符串。
实例

解决方案

1.递归版

python

class Solution:
    def isScramble(self, s1, s2):
        """
        :type s1: str
        :type s2: str
        :rtype: bool
        """
        if len(s1) != len(s2): return False 
        if s1 == s2: return True 
        t1,t2 = s1,s2
        if sorted(t1) != sorted(t2): return False

        for i in range(1,len(s1)):
            s11 = s1[:i]
            s12 = s1[i:]
            s21 = s2[:i]
            s22 = s2[i:]
            if self.isScramble(s11,s21) and self.isScramble(s12,s22): return True
            s21 = s2[:len(s2)-len(s11)]
            s22 = s2[len(s2)-len(s11):]
            if self.isScramble(s11,s22) and self.isScramble(s12,s21): return True

        return False

2. DP版,非递归

时间复杂度O(N^4)。我们引入一个布尔矩阵isS[len][i][j],表示字符串s1[i…i+len-1]是字符串s2[j…j+len-1]的乱序字符串

class Solution {
public:
    bool isScramble(string s1, string s2) {
        int sSize = s1.size(), len, i, j, k;
        if(0==sSize) return true;
        if(1==sSize) return s1==s2;
        bool isS[sSize+1][sSize][sSize];

        for(i=0; i<sSize; ++i)
            for(j=0; j<sSize; ++j)
                isS[1][i][j] = s1[i] == s2[j];

        for(len=2; len <=sSize; ++len)
            for(i=0; i<=sSize-len; ++i)
                for(j=0; j<=sSize-len; ++j)
                {
                    isS[len][i][j] = false;
                        for(k=1; k<len && !isS[len][i][j]; ++k)
                        {
                            isS[len][i][j] = isS[len][i][j] || (isS[k][i][j] && isS[len-k][i+k][j+k]);
                            isS[len][i][j] = isS[len][i][j] || (isS[k][i+len-k][j] && isS[len-k][i][j+k]);
                        }
                }
        return isS[sSize][0][0];            

    }
}; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用MATLAB实现图像加扰的例子: ```matlab function [resultImage] = hb_imageScramble(inputImage, nSection, showOption) % 获取输入图像的尺寸 [height, width, ~] = size(inputImage); % 计算每个小块的尺寸 blockSize = floor(height / nSection); % 创建一个空白图像用于存储结果 resultImage = uint8(zeros(height, width)); % 对每个小块进行打乱 for i = 1:nSection for j = 1:nSection % 获取当前小块的位置 rowStart = (i - 1) * blockSize + 1; rowEnd = i * blockSize; colStart = (j - 1) * blockSize + 1; colEnd = j * blockSize; % 提取当前小块 block = inputImage(rowStart:rowEnd, colStart:colEnd, :); % 将小块打乱 scrambledBlock = block(randperm(blockSize^2)); % 将打乱后的小块放回结果图像中 resultImage(rowStart:rowEnd, colStart:colEnd, :) = scrambledBlock; end end % 根据showOption参数决定是否显示结果图像 if showOption figure; subplot(1, 2, 1); imshow(inputImage); title('原始图像'); subplot(1, 2, 2); imshow(resultImage); title('加扰后的图像'); end end % 使用示例 img = imread('football.jpg'); result = hb_imageScramble(img, 8, true); ``` 这个例子中,`hb_imageScramble`函数接受三个参数:`inputImage`是输入图像矩阵,`nSection`是将图像分成多少个小块进行打乱,`showOption`是一个布尔值,决定是否显示加扰后的图像。函数会将输入图像分成`nSection` x `nSection`个小块,然后对每个小块进行打乱,最后将打乱后的小块重新组合成加扰后的图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值