5076-字符串的最大公因子

前言

Weekly Contest 139字符串的最大公因子oop

對於字符串 ST,只有在 S = T + ... + TT 與自身鏈接 1 次或屢次)時,咱們才認定 「T 能除盡 S」。code

返回字符串 X,要求知足 X 能除盡 str1X 能除盡 str2leetcode

示例1:字符串

輸入:str1 = "ABCABC", str2 = "ABC"
輸出:"ABC"

示例2:get

輸入:str1 = "ABABAB", str2 = "ABAB"
輸出:"AB"

示例3:string

輸入:str1 = "LEET", str2 = "CODE"
輸出:""

提示:io

  1. 1 <= str1.length <= 1000
  2. 1 <= str2.length <= 1000
  3. str1[i]str2[i] 爲大寫英文字母

解題思路

本題須要注意,若是字符串ST自己不是有特定字符串循環組成的,那麼其實字符串ST直接也不存在一個最大公因子。個人解題思路是將問題進行分解,分解爲如下3步:test

  1. 提取循環因子:判斷字符串是否由特定字符循環組成,並找出全部能夠組成字符串的循環字符串
  2. 提取公因子:字符串ST的循環因子結果進行並集計算
  3. 提取最大公因子:從公因子集合中找出長度最大的字符串

實現代碼

/**
     * 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;
    }
相關文章
相關標籤/搜索