獲取兩個字符串所有公共的子串算法

應用場景: 獲取兩個字符串所有公共的子串。

思路: 1. 先獲取兩個子串的交集

             2. 遍歷交集子串,從最短子串到最長子串


public static List<String> getAllCommonSubStrings(String str1, String str2) {
        //TODO null check.
        
        String longString = str1;
        String shortString = str2;
        if(str1.length() < str2.length()){
            longString = str2;
            shortString = str1;
        }
        
        List<String> result = new ArrayList<String>();
        List<String> vacancy = new ArrayList<String>();
        vacancy.add("");
        
        List<String> list1 = Arrays.asList(shortString.split(""));
        List<String> list2 = Arrays.asList(longString.split(""));
        
        result.addAll(list1);
        result.retainAll(list2);
        result.removeAll(vacancy);
        
        List<String> commonSubStrings = new ArrayList<String>();
        StringBuffer strBuf = new StringBuffer();
        
        for(int i = 0; i < result.size()-1; i++){
            strBuf = strBuf.append(result.get(i));
            if(shortString.contains(strBuf + result.get(i+1)) 
                    && longString.contains(strBuf + result.get(i+1))
                    && i < result.size()-2){
                continue;
            }else{
               commonSubStrings.add(strBuf.toString());
               strBuf = new StringBuffer();
            }
        }
        String tail = commonSubStrings.get(commonSubStrings.size()-1)+ result.get(result.size()-1);
        if(shortString.contains(tail)
                && longString.contains(tail)){
            commonSubStrings.set(commonSubStrings.size()-1, tail);
        }else{
            commonSubStrings.add(result.get(result.size()-1));
        }
        
        return commonSubStrings;
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章