当前位置: 首页 > article >正文

JAVA学习-练习试用Java实现“扰乱字符串”

问题:


使用下面描述的算法可以扰乱字符串 s 得到字符串 t :
如果字符串的长度为 1 ,算法停止
如果字符串的长度 > 1 ,执行下述步骤:
在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。
随机 决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,在执行这一步骤之后,s 可能是 s = x + y 或者 s = y + x 。
在 x 和 y 这两个子字符串上继续从步骤 1 开始递归执行此算法。
给你两个 长度相等 的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。如果是,返回 true ;否则,返回 false 。

示例 1:

输入:s1 = "great", s2 = "rgeat"
输出:true
解释:s1 上可能发生的一种情形是:
"great" --> "gr/eat" // 在一个随机下标处分割得到两个子字符串
"gr/eat" --> "gr/eat" // 随机决定:「保持这两个子字符串的顺序不变」
"gr/eat" --> "g/r / e/at" // 在子字符串上递归执行此算法。两个子字符串分别在随机下标处进行一轮分割
"g/r / e/at" --> "r/g / e/at" // 随机决定:第一组「交换两个子字符串」,第二组「保持这两个子字符串的顺序不变」
"r/g / e/at" --> "r/g / e/ a/t" // 继续递归执行此算法,将 "at" 分割得到 "a/t"
"r/g / e/ a/t" --> "r/g / e/ a/t" // 随机决定:「保持这两个子字符串的顺序不变」
算法终止,结果字符串和 s2 相同,都是 "rgeat"
这是一种能够扰乱 s1 得到 s2 的情形,可以认为 s2 是 s1 的扰乱字符串,返回 true
示例 2:

输入:s1 = "abcde", s2 = "caebd"
输出:false
示例 3:

输入:s1 = "a", s2 = "a"
输出:true
提示:

s1.length == s2.length
1 <= s1.length <= 30
s1 和 s2 由小写英文字母组成
以下程序实现了这一功能,请你填补空白处内容:

class Solution {
    public boolean isScramble(String s1, String s2) {
        if (s1.length() == 0 && s2.length() == 0)
            return true;
        if (s1.length() != s2.length())
            return false;
        return dfs(s1.toCharArray(), s2.toCharArray(), 0, 0, s1.length());
    }
    private boolean dfs(char[] s1, char[] s2, int start1, int start2, int len) {
        if (len == 1) {
            return s1[start1] == s2[start2];
        }
        if (!equals(s1, s2, start1, start2, len)) {
            return false;
        }
        for (int i = 1; i < len; i++) {
            ____________________;
        }
        return false;
    }
    public boolean equals(char[] s1, char[] s2, int start1, int start2, int len) {
        int[] charArr = new int[26];
        for (int i = 0; i < len; i++) {
            charArr[s1[start1 + i] - 'a']++;
            charArr[s2[start2 + i] - 'a']--;
        }
        for (int item : charArr) {
            if (item != 0)
                return false;
        }
        return true;
    }
}

解答思路:

以下是填补空白处后的完整代码:   

class Solution {
    public boolean isScramble(String s1, String s2) {
        if (s1.length() == 0 && s2.length() == 0)
            return true;
        if (s1.length()!= s2.length())
            return false;
        return dfs(s1.toCharArray(), s2.toCharArray(), 0, 0, s1.length());
    }

    private boolean dfs(char[] s1, char[] s2, int start1, int start2, int len) {
        if (len == 1) {
            return s1[start1] == s2[start2];
        }
        if (!equals(s1, s2, start1, start2, len)) {
            return false;
        }
        for (int i = 1; i < len; i++) {
            if ((dfs(s1, s2, start1, start2, i) && dfs(s1, s2, start1 + i, start2 + i, len - i)) || (dfs(s1, s2, start1, start2 + len - i, i) && dfs(s1, s2, start1 + i, start2, len - i))) {
                return true;
            }
        }
        return false;
    }

    public boolean equals(char[] s1, char[] s2, int start1, int start2, int len) {
        int[] charArr = new int[26];
        for (int i = 0; i < len; i++) {
            charArr[s1[start1 + i] - 'a']++;
            charArr[s2[start2 + i] - 'a']--;
        }
        for (int item : charArr) {
            if (item!= 0)
                return false;
        }
        return true;
    }
}


(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)


http://www.kler.cn/news/336107.html

相关文章:

  • (c#)unity中sqlite多线程同时开启事务会导致非常慢
  • (4)MATLAB生成CRC校验码
  • Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出
  • Vue3-TS-Lodash:理解Lodash / 常用方法积累
  • 银行数字化转型导师坚鹏:2025年银行开门红绩效管理方法及案例
  • 家庭厨房的蟑螂消灭治理方法
  • 【机器学习-无监督学习】概率图模型
  • 毕业设计项目——基于transformer的中文医疗领域命名实体识别(论文/代码)
  • class 029 重要排序算法的总结
  • 数据分布过于集中 怎么办,python 人工智能 ,数据分析,机器学习pytorch tensorflow ,
  • 【C++】二叉搜索树+变身 = 红黑树
  • Python的几个高级特性
  • 谷粒商城のRabbitMQ基础篇
  • 制作离线版Koczkatamas工具包
  • 洛谷 P11045 [蓝桥杯 2024 省 Java B] 最优分组
  • Linux 系统 nvm 管理node无法使用
  • python爬虫 - 初识requests模块
  • 民锋金融:稳健发展的战略与未来展望
  • 代码随想录Day 62|Floyd 算法精讲、A \* 算法精讲 (A star算法),题目:97. 小明逛公园、127. 骑士的攻击
  • 关于BSV区块链覆盖网络的常见问题解答(下篇)