[程式設計挑戰]交替字串,僅供參考
阿新 • • 發佈:2018-12-09
package com.zq.challenge; /** * 如果字串str3能夠由str1和str2中的字元按順序交替形成,那麼稱str3為str1和str2的交替字串。 * 例如str1="abc",str2="def",那麼"adbecf", "abcdef", "abdecf", "abcdef", "adefbc"等等都為 * str1和str2的交替字串。更形式化的,str3的生成演算法如下: str3="" while str1不為空 or str2不為空: * 把str1或str2的首字元加入到str3,並從str1或str2中刪除相應的字元 end 給定str1, str2,和str3, * 判斷str3是否為str1和str2的交替字串。 輸入格式: 多組資料,每組資料三行,分別是str1,str2,str3。str1, * str2的長度在[1..100]範圍內,str3的範圍在[1..200]範圍內。字串只包含小寫英文字母。 輸出格式: * 每組資料輸出一行YES或者NO。 * @author kk * */ public class ChangeStrTest { public static void main(String[] args) { String str1 = "abc"; String str2 = "def"; String str3 = "abcdef"; //true String str4 = "abdecf"; //true String str5 = "adbecf"; //true String str6 = "adbbec"; //false System.out.println(judgeIntersect(str1,str2,str3)); System.out.println(judgeIntersect(str1,str2,str4)); System.out.println(judgeIntersect(str1,str2,str5)); System.out.println(judgeIntersect(str1,str2,str6)); String str7 = "abcd"; String str8 = "adce"; String str9 = "abacddce"; //true String str10 = "abacddcef"; //false String str11 = "abacddc"; //false String str12 = "aadbcdce"; //true System.out.println(judgeIntersect(str7,str8,str9)); System.out.println(judgeIntersect(str7,str8,str10)); System.out.println(judgeIntersect(str7,str8,str11)); System.out.println(judgeIntersect(str7,str8,str12)); } public static boolean judgeIntersect(String str1,String str2, String str3){ if(str1.length()+str2.length() != str3.length()){ return false; } char []str1Array = str1.toCharArray(); char []str2Array = str2.toCharArray(); char []str3Array = str3.toCharArray(); return judgeInterset(str1Array,str2Array,str3Array,0,str1Array.length-1,0,str2Array.length-1,0,str3Array.length-1); } public static boolean judgeInterset(char []str1Array, char[] str2Array, char []str3Array, int str1Start, int str1End, int str2Start, int str2End, int str3Start, int str3End){ if(str1Start > str1End){ if(str2End - str2Start != str3End - str3Start){ return false; }else{ for(int i=0; i<=str2End-str2Start; i++){ if(str2Array[str2Start+i] != str3Array[str3Start+i]){ return false; } } return true; } }else if(str2Start > str2End){ if(str1End - str1Start != str1End - str1Start){ return false; }else{ for(int i=0; i<=str1End-str1Start; i++){ if(str1Array[str1Start+i] != str3Array[str3Start+i]){ return false; } } return true; } } if(str1End-str1Start + str2End - str2Start+1 != str3End - str3Start){ return false; } if(str1Array[str1Start] == str2Array[str2Start]){ if(str1Array[str1Start] == str3Array[str3Start]){ return judgeInterset(str1Array,str2Array,str3Array, str1Start+1,str1End,str2Start,str2End,str3Start+1,str3End) || judgeInterset(str1Array,str2Array,str3Array, str1Start,str1End,str2Start+1,str2End,str3Start+1,str3End); } }else if(str1Array[str1Start] == str3Array[str3Start]){ return judgeInterset(str1Array,str2Array,str3Array, str1Start+1,str1End,str2Start,str2End,str3Start+1,str3End); }else if(str2Array[str2Start] == str3Array[str3Start]){ return judgeInterset(str1Array,str2Array,str3Array, str1Start,str1End,str2Start+1,str2End,str3Start+1,str3End); } return false; } }