編寫函數,獲取兩段字符串的最長公共子串的長度

題目:編寫函數,獲取兩段字符串的最長公共子串的長度


例如:
S1 = GCCCTAGCCAGDE
S2 = GCGCCAGTGDE
這兩個序列的最長公共字串爲GCCAG,也就是說返回值爲5。

參數:str1和str2表示兩個字符串
返回值:返回兩段字符串的最長公共子串的長度

int findLargestSizeString(String str1, String str2)


此題爲動態規劃問題,在筆試題中遇到,開始想法爲暴力窮舉,參考資料,歸類爲【動態規劃】問題。
時間複雜度O(M*N) 額外空間複雜度爲O(M*N),經過優化可將空間複雜度降爲O(1)。
動態規劃:
1.生成動態規劃表 M*N的矩陣
2.dp[i][j]的含義爲在必須以arr1[i]和arr2[j]當作公共子串最後一個字符的情況下,公共子串的長度。

這裏寫圖片描述

dp矩陣:
這裏寫圖片描述

求解dp矩陣==》getDp()

int [][]getdp(char []arr1,char []arr2)
    {
        int [][]dp = new int [arr1.length][arr2.length];
        for(int i = 0;i<arr1.length;++i) //第一列賦值
        {
            if(arr1[i] == arr2[0])
            {
                dp[i][0] = 1;
            }
        }
        for(int j = 1;j<arr2.length;++j) // 第一行賦值
        {
            if(arr2[j]==arr1[0])
            {
                dp[0][j]=1;
            }
        }
        for(int i = 1;i<arr1.length;++i)  // 其餘位置相等的賦值爲 左上角加1 ==》當前子串長度
        {
            for(int j = 1;j<arr2.length;++j)
            {
                if(arr1[i]==arr2[j])
                {
                    dp[i][j] = dp[i-1][j-1]+1;
                }
            }
        }
        return dp;

    }
int findLargestSizeString(String str1, String str2)
    {
        if(str1==null || str2==null ||str1.equals("") ||str2.equals(""))
        {
        return -1;
        }
        char [] arr1 = str1.toCharArray();
        char [] arr2 = str2.toCharArray();
        int [][] dp= getdp(arr1,arr2);
        int end = 0;
        int maxlen = 0;
        for(int i = 0; i<arr1.length;++i)
        {
            for(int j = 0;j<arr2.length;++j)
            {
                if(dp[i][j] > maxlen)  // 如果所在值大於 maxlen
                {
                    end = i;             // end 即爲結束子串的位置下標
                    maxlen = dp[i][j];         // 更新maxlen 
                }
            }
        }
        String subs = str1.substring(end-maxlen+1, end+1); 
        System.out.println("兩個字符串的最長相同子串:"+subs);
        return maxlen;
    }

測試代碼:

public static void main(String[] args){

        String str1 ="GCCCTAGCCAGDE";
        String str2 = "GCGCCAGTGDE";
        HelloWorld h = new HelloWorld();
        int len = h.findLargestSizeString(str1, str2);
        System.out.println("len:"+len);
    }

結果:
這裏寫圖片描述

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