leetcode做题笔记87扰乱字符串

news/2024/7/23 10:57:26 标签: leetcode, 笔记, 算法

使用下面描述的算法可以扰乱字符串 s 得到字符串 t :

  1. 如果字符串的长度为 1 ,算法停止
  2. 如果字符串的长度 > 1 ,执行下述步骤:
    • 在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。
    • 随机 决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,在执行这一步骤之后,s 可能是 s = x + y 或者 s = y + x 。
    • 在 x 和 y 这两个子字符串上继续从步骤 1 开始递归执行此算法

给你两个 长度相等 的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。如果是,返回 true ;否则,返回 false 。

思路一:模拟题意

bool check(char *s1,char *s2,int len)
{
    char ss1[26]={0};
    char ss2[26]={0};
    char i=0;
    for (i=0;i<len;i++)
    {
        ss1[s1[i]-'a']++;
        ss2[s2[i]-'a']++;
    }
    for(i=0;i<26;i++)
    {
        if(ss1[i]!=ss2[i]) return false;
    }
    return true;
}
char mem[30][30][31];
bool complie(char *s1,char *s2,int len,int s1begin,int s2begin)
{
    if(mem[s1begin][s2begin][len]==1) return true;
    if(mem[s1begin][s2begin][len]==2) return false;
    if(len==0) return true;
    if(len==1) {mem[s1begin][s2begin][len]=1;return *s1==*s2;}
    if(!check(s1,s2,len)) {mem[s1begin][s2begin][len]=2;return false;}
    int i=0;
    for(i=1;i<len;i++)
    {
        if(complie(s1,s2,i,s1begin,s2begin) && complie(s1+i,s2+i,len-i,s1begin+i,s2begin+i)) {
            mem[s1begin][s2begin][len]=1;
            return true;}
        if(complie(s1,s2+len-i,i,s1begin,s2begin+len-i) && complie(s1+i,s2,len-i,s1begin+i,s2begin)) {
            mem[s1begin][s2begin][len]=1;
            return true;}
    }
    mem[s1begin][s2begin][len]=2;
    return false;
}
bool isScramble(char * s1, char * s2){
    int len1=0;
    int len2=0;
    memset(mem,0,sizeof(mem));
    while(s1[len1]!=0)
    {
        len1++;
    }
    while(s2[len2]!=0)
    {
        len2++;
    }
    if(len1!=len2) return false;
    return complie(s1,s2,len1,0,0);
}

分析:

本题扰乱字符串满足交换两个子字符串或保持这两个子字符串的顺序不变,转换为complie(s1,s2,i,s1begin,s2begin) && complie(s1+i,s2+i,len-i,s1begin+i,s2begin+i)和complie(s1,s2+len-i,i,s1begin,s2begin+len-i) && complie(s1+i,s2,len-i,s1begin+i,s2begin),通过complie函数递归找到答案,同时两个字符串长度首先要相等,先判断两个字符串长度是否相等再进行递归返回答案

总结:

本题考察递归的应用,利用递归交换两个子字符串或保持这两个子字符串的顺序不变判断是否为扰乱字符串


http://www.niftyadmin.cn/n/4950517.html

相关文章

【第四章 字符串part02】

28. 实现 strStr() 题目 BF算法 public int strStr(String s, String p) {// 输入&#xff1a;haystack "sa", needle "ss"//输出&#xff1a;0// bf算法int sLen s.length();int pLen p.length();for (int i 0; i < sLen-pLen1; i) {if(isEqu…

代码随想录 (二)链表

链表 二 移除链表元素 1 没有头结点 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next)…

html流光按钮

出处bilibili猫咪爱狗 <!DOCTYPE html> <html><head><style>body {/*内容居中&#xff0c;背景色*/height: 100vh;display: flex;justify-content: center; align-items: center;background-color: #000;}a { /*水平垂直居中*/position: re…

智能可穿戴:探索未来的无人之境

智能可穿戴&#xff1a;探索未来的无人之境 目录 引言智能可穿戴的历史与现状智能可穿戴的下一个蓝海&#xff1a;概念与理论市场展望&#xff1a;无人之境技术挑战与机遇结论 1. 引言 在科技的洪流中&#xff0c;智能可穿戴设备脱颖而出&#xff0c;以其便捷性、个性化和智…

Java Map、JSONObject、实体类互转

文章目录 前言Map、JSONObject、实体类互转 前言 使用库 com.alibaba.fastjson2&#xff0c;可完成大部分JSON转换操作。 详情参考文章: Java FASTJSON2 一个性能极致并且简单易用的JSON库 Map、JSONObject、实体类互转 import com.alibaba.fastjson2.JSON; import com.alib…

探索短视频小程序/小年糕

短视频小程序的兴起&#xff0c;为创作者提供了一个全新的平台&#xff0c;让他们能够以更专业的方式展现自己的作品。这种创作形式不仅要求作品内容足够精彩还需要有深度的思考和逻辑性的呈现。本文将探索短视频小程序的专业与深度的创作之道&#xff0c;帮助创作者更好地发挥…

Linux—LVM基础

Linux—LVM 一、什么是LVM二、LVM名词解释三、LVM的写入模式四、LVM的工作原理五、LVM的优缺点六、创建PV/VG/LV的方法补充说明 一、什么是LVM LVM&#xff08;Logical Volume Manager&#xff09;&#xff0c;即逻辑卷管理&#xff0c;是Linux环境下对磁盘分区进行管理的一种…

C语言,malloc使用规范

malloc 是 C 语言中用于分配内存的函数。它的名称是“memory allocation”的缩写。malloc 是在 <stdlib.h> 头文件中定义的。 malloc 的基本语法是&#xff1a; void* malloc(size_t size); 其中 size_t是要分配的字节数。如果分配成功&#xff0c;malloc返回一个指向分配…