java基础学习

最长子序列问题

2020-03-03  本文已影响0人  迷糊银儿
public class subArray {
    public static int getSum_SubArr(int[] arr){
        int sum=0;
        if (arr.length<=0)
            return sum;
        for (int i=0;i<arr.length;i++){
            if (sum<0){
                sum=arr[i];
            }else {
                sum+=arr[i];
            }
        }
        System.out.println("sum="+sum);
        return sum;
    }

    public static void main(String[] args){
        //int[] a={1,-2,3,10,-4,7,2,-5};
        int[] a={1,3,-8,5};
        getSum_SubArr(a);
    }
}

不过在二维矩阵上找最长的由1组成的斜对角线也是件麻烦费时的事,下面改进:当要在矩阵是填1时让它等于其左上角元素加1。


image.png

这样矩阵中的最大元素就是 最长公共子串的长度。

在构造这个二维矩阵的过程中由于得出矩阵的某一行后其上一行就没用了,所以实际上在程序中可以用一维数组来代替这个矩阵。

public class Solution{
    
    // 求解两个字符号的最长公共子串
    public static String maxSubstring(String strOne, String strTwo){
        // 参数检查
        if(strOne==null || strTwo == null){
            return null;
        }
        if(strOne.equals("") || strTwo.equals("")){
            return null;
        }
        // 矩阵的横向长度
        int len1 = strOne.length();
        // 矩阵的纵向长度
        int len2 = strTwo.length();
        
        // 保存矩阵的上一行
        int[] topLine = new int[len1];
        // 保存矩阵的当前行
        int[] currentLine = new int[len1];
        // 矩阵元素中的最大值
        int maxLen = 0;
        // 矩阵元素最大值出现在第几列
        int pos = 0;
        char ch = ' ';
        for(int i=0; i<len2; i++){
            ch = strTwo.charAt(i);
            // 遍历str1,填充当前行的数组
            for(int j=0; j<len1; j++){
                if( ch == strOne.charAt(j)){
                    // 如果当前处理的是矩阵的第一列,单独处理,因为其坐上角的元素不存在
                    if(j==0){
                        currentLine[j] = 1;
                    } else{
                        currentLine[j] = topLine[j-1] + 1;
                    }
                    if(currentLine[j] > maxLen){
                        maxLen = currentLine[j];
                        pos = j;
                    }
                }
            }
            // 将矩阵的当前行元素赋值给topLine数组; 并清空currentLine数组
            for(int k=0; k<len1; k++){
                topLine[k] = currentLine[k];
                currentLine[k] = 0;
            }
            // 或者采用下面的方法
            // topLine = currentLine;
            // currentLine = new int[len1];
        }
        return strOne.substring(pos-maxLen+1, pos+1);
    }
    
    public static void main(String[] args) {
        String str1 = "bab";
        String str2 = "caba";
        String result = Solution.maxSubstring(str1, str2);
        System.out.println(result);
    }
}
上一篇下一篇

猜你喜欢

热点阅读