实现一个函数,判断aim是 否是str1和str2交错组成。
创始人
2024-02-06 01:55:17
0

问题描述:

        给定三个字符串str1、str2和aim,如果aim包含且仅包含来自str1和str2的所有字符, 而且在aim中属于str1的字符之间保持原来在str1中的顺序,属于str2的字符之间保持 原来在str2中的顺序,那么称aim是str1和str2的交错组成。实现一个函数,判断aim是 否是str1和str2交错组成。
【举例】

         str1="AB",str2="12"。那么"AB12"、"A1B2"、"A12B"、"1A2B"和"1AB2"等都是 str1 和 str2 的 交错组成。

思路:

        不管使用那种思路解题,我们必须保证字符串aim的长度是字符串str1和str2两个长度之和。

        首先我们可能会想到使用快排中的merge思想。从字符串aim的头到位遍历字符,查看当前字符时str1和str2中的哪一个,相对应的指针就向后移动一个位置,若和两个字符串中指针所指的字符都不同则直接返回false。查看字符串aim的指针是否能移动到最后的位置,如能则返回true。这种思路对于str1和str2没有相同重复字符的情况下是可行的,但是对于有相同重复字符的情况就不成立了,我们可以举下面的例子进行验证。

        例:str1="aaabc"  str2="aaa31"   aim="aaa3aab1c"

思路一:使用动态规划的思想。

        新建一张二维表dp[i][j],行从0-str1.length,每一行表示str1前缀i的长度即str1[0..i-1],列从0-str2.length,每一列表示str2前缀j长度即str2[0..j-1]。二维表dp含义是str1前缀i长度和str2前缀j长度能否交错组成aim前缀i+j长度。

        二维表第一行第一列表示str1和str2都是用前缀0长度,生成前缀0长度的aim,一定成立填入true。

        二维表第一行表示str1前缀0长度和str2前缀相应长度组成的相应前缀长度的aim,依次判断str2和aim对应字符是否相同即可,只要出现依次false,该行后序全部填入false。

        二维表第一列表示str2前缀0长度和str1前缀相应长度组成的相应前缀长度的aim,依次判断str1和aim对应字符是否相同即可,只要出现依次false,该行后序全部填入false。

        二维表的其他位置我们做出以下分析(假设目前位置为dp[i][j]),存在两种情况:1. aim[i+j-1]==str1[i-1] && dp[i-1][j]         2. aim[i+j-1]==str2[j-1] && dp[i][j-1]  。这两种情况下二维表dp[i][j]填写true,若aim[i+j-1]==str1[i-1]==str2[j-1]则dp[i-1][j]和dp[i][j-1] 满足一个也填写true,其他情况全部填写false。

思路二:使用动态规划的空间压缩技术。

代码:

思路一代码

    public static boolean isCross1(String s1, String s2, String ai) {if (s1 == null || s2 == null || ai == null) {return false;}char[] str1 = s1.toCharArray();char[] str2 = s2.toCharArray();char[] aim = ai.toCharArray();if (aim.length != str1.length + str2.length) {return false;}boolean[][] dp = new boolean[str1.length + 1][str2.length + 1];dp[0][0] = true;for (int i = 1; i <= str1.length; i++) {if (str1[i - 1] != aim[i - 1]) {break;}dp[i][0] = true;}for (int j = 1; j <= str2.length; j++) {if (str2[j - 1] != aim[j - 1]) {break;}dp[0][j] = true;}for (int i = 1; i <= str1.length; i++) {for (int j = 1; j <= str2.length; j++) {if ((str1[i - 1] == aim[i + j - 1] && dp[i - 1][j]) || (str2[j - 1] == aim[i + j - 1] && dp[i][j - 1])) {dp[i][j] = true;}}}return dp[str1.length][str2.length];}

思路二代码

    public static boolean isCross2(String str1, String str2, String aim) {if (str1 == null || str2 == null || aim == null) {return false;}char[] ch1 = str1.toCharArray();char[] ch2 = str2.toCharArray();char[] chaim = aim.toCharArray();if (chaim.length != ch1.length + ch2.length) {return false;}char[] longs = ch1.length >= ch2.length ? ch1 : ch2;char[] shorts = ch1.length < ch2.length ? ch1 : ch2;boolean[] dp = new boolean[shorts.length + 1];dp[0] = true;for (int i = 1; i <= shorts.length; i++) {if (shorts[i - 1] != chaim[i - 1]) {break;}dp[i] = true;}for (int i = 1; i <= longs.length; i++) {dp[0] = dp[0] && longs[i - 1] == chaim[i - 1];for (int j = 1; j <= shorts.length; j++) {if ((longs[i - 1] == chaim[i + j - 1] && dp[j]) || (shorts[j - 1] == chaim[i + j - 1] && dp[j-1])) {dp[j] = true;} else {dp[j] = false;}}}return dp[shorts.length];}public static void main(String[] args) {String str1 = "1234";String str2 = "abcd";String aim = "1a23bcd4";System.out.println(isCross1(str1, str2, aim));System.out.println(isCross2(str1, str2, aim));}

相关内容

热门资讯

杨字的含义 杨字的含义 扬:张扬,自得的意思【解释】:趾高:走路时脚抬得很高;气扬:意气扬扬。走路时脚抬得很...
有梦子的四字成语? 有梦子的四字成语?白日做梦、魂牵梦萦、如梦初醒、梦寐以求、酣然入梦、半梦半醒、重温旧梦、夜长梦多、同...
恶人自有恶人磨 恶人自有恶人磨恶人自有恶人磨 (è rén zì yǒu è rén mó)解释:凶恶成性的人自然...
相对论中,火车断桥问题的答案是... 相对论中,火车断桥问题的答案是什么?这个假设唯一只有一个问题。败伏什么叫做“同时”?“只有两个发射器...
虎什么熊的成语 虎什么熊的成语这不是闹经急转弯虎背熊腰hǔ bèi xióng yāo成语解释如虎般宽厚的背;似熊样...
《亡念之扎姆德》男主角最后跟谁... 《亡念之扎姆德》男主角最后跟谁在一起?男主石化了九年,女主每天都来和他说话,然后九年后的第二天男主解...
火影忍者动画和漫画貌似不一样,... 火影忍者动画和漫画貌似不一样,海贼王动画和漫画一样吗?总是有些偏差的吧。。个人比较忠实原作。海贼王没...
让人非我弱,得志莫离群 让人非我弱,得志莫离群像投鼠忌器一样的意思吧,我躲,不是我怕你,而是我心有顾忌.不是因为势力差距而起...
《北宋小厨师》这本书更到现在男... 《北宋小厨师》这本书更到现在男猪脚泡到李师师和李清照了吗没有0.0....还没有啊因为还没结局
路边油炸的小摊上的酱是怎么做的... 路边油炸的小摊上的酱是怎么做的!要是家用,那可以选择用芝麻浆来做主配料.芝麻浆和水要1:1(水最好是...
《超禁忌游戏-五十分之一》应该... 《超禁忌游戏-五十分之一》应该完结了吧你要的是完整版的,但负责任地告诉你,现在不可能有,有也是骗你的...
公共经济学 答案 公共经济学 答案这个真不知道~!~谢谢~!~1.D2.D3.C4.B5.C6.D7.C8.B9.B1...
证券投资学 跟投资学有什么区别 证券投资学 跟投资学有什么区别投资学包括证券投资学。投资学包括各方面的投资学,比如黄金投资,期货投资...
忘记名字了,就是男主得到系统打... 忘记名字了,就是男主得到系统打英雄联盟,在联盟里边开挂可以变身眼可以变成野怪可以身穿求这部小说名字你...
个性签名为了你我愿意变成魔于全... 个性签名为了你我愿意变成魔于全世界为敌不爱那么多,只爱一点点,别人眉来又眼去,我只偷看你一眼。不要走...
野钓实用技巧 黑坑钓鱼技巧? 野钓实用技巧 黑坑钓鱼技巧?钓什么鱼要了解鱼的习性,了解对象鱼生活在哪个水层,喜欢吃什么食物,然后根...
江哲是那本书的? 江哲是那本书的?字随云的是《随波逐流之一代军师》字守义的是《三国之宅行天下》呵呵……这两本小说的江哲...
满满的生活经历是啥意思? 满满的生活经历是啥意思?满满的生活经历,说明的是这个人的生活阅历很深。
哪部国产青春剧比较贴近现实? 哪部国产青春剧比较贴近现实?《最好的我们》比较贴近现实,讲述的就是校园爱情故事,说的就是真实的高中生...
天涯海角与君共度 出自哪首歌呢... 天涯海角与君共度 出自哪首歌呢。云中歌主题曲丝罗李宇春的丝罗你好。楼主。李宇春《丝罗》伊本丝萝愿托乔...