Weekly Contest 139的 字符串的最大公因子:oop
對於字符串
S
和T
,只有在S = T + ... + T
(T
與自身鏈接 1 次或屢次)時,咱們才認定 「T
能除盡S
」。code返回字符串
X
,要求知足X
能除盡str1
且X
能除盡str2
。leetcode示例1:字符串
輸入:str1 = "ABCABC", str2 = "ABC" 輸出:"ABC"示例2:get
輸入:str1 = "ABABAB", str2 = "ABAB" 輸出:"AB"示例3:string
輸入:str1 = "LEET", str2 = "CODE" 輸出:""提示:io
1 <= str1.length <= 1000
1 <= str2.length <= 1000
str1[i]
和str2[i]
爲大寫英文字母
本題須要注意,若是字符串S
和T
自己不是有特定字符串循環組成的,那麼其實字符串S
和T
直接也不存在一個最大公因子。個人解題思路是將問題進行分解,分解爲如下3
步:test
S
和T
的循環因子結果進行並集計算/** * 5076. 字符串的最大公因子 * @param str1 * @param str2 * @return */ public String gcdOfStrings(String str1, String str2) { List<String> loopStr1=findLoopStrings(str1); List<String> loopStr2=findLoopStrings(str2); List<String> union=new ArrayList<>(); if(!loopStr1.isEmpty() && !loopStr2.isEmpty()){// 不存在循環因子 for(String l1:loopStr1){// 進行並集運算,提取公因子 for (String l2: loopStr2) { if(l1.equals(l2)){ union.add(l1); } } } if(union.isEmpty()){// 無公因子,直接返回空字符 return ""; } // 找出長度最大的字符串 return union.stream().collect(Collectors.maxBy(Comparator.comparing(String::length))).get(); } return ""; } /** * 獲取組成循環字符串的子串 * @param str * @return */ private List<String> findLoopStrings(String str){ List<String> result=new ArrayList<>(); for(int i=0;i<str.length();i++){ // 循環子串 String subStr=str.substring(0,i+1); if(str.length()%subStr.length()==0){// 子串長度能夠被原字符串長度整除 // 比較次數 int times= str.length()/subStr.length(); // 是否匹配 boolean match=true; for(int j=0;j<times;j++){ if(!str.substring(j*subStr.length(),(j+1)*subStr.length()).equals(subStr)){ match=false; break; } } if(match){ result.add(subStr); } } } return result; }