使用动态规划计算最长公共子串

public class MatchStr {

    public static String a="abcdfishftfuia345345345";

    public static String b="foshdguuuutfu345345345abcd";

    public static void main(String [] arg){

        char[] c1=  a.toCharArray();      
        char[] c2 = b.toCharArray();      
        int [] [] all=new int[c1.length][c2.length];      
        for(int i=0; i<c1.length; i++){           
            for(int j=0; j<c2.length; j++){              
                all[i][j]=0;
            }           
        } 

        List<Character> list=new ArrayList<>();
        for(int i=0; i<c1.length; i++){          
            for(int j=0; j<c2.length; j++){             
                if(c1[i]==c2[j]){                 
                    int a1=i-1;
                    if(a1<0){
                        a1=0;
                    }               
                    int b1=j-1;
                    if(b1<0){
                        b1=0;
                    }                   
                    all[i][j]=all[a1][b1]+1;  
                }else{
                    all[i][j]=0;
                }         
            }

        }

        int maxx=0;
        int maxy=0;
        int max=0;
        for(int i=0; i<c1.length; i++){           
            for(int j=0; j<c2.length; j++){  
                if(all[i][j]>max){
                    maxx=i;
                    maxy=j;
                    max=all[i][j];
                }
            }      
        } 

        System.out.println(max+"->"+maxx+"->"+maxy);      
        for(int i=0; i<max; i++){
            list.add(c1[maxx-i]);
        }     
        Collections.reverse(list);     
        for(int i=0; i<list.size(); i++){           
            System.out.print(list.get(i));
        }
    }

}

猜你喜欢

转载自blog.51cto.com/12597095/2326486