题目描述:
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码 进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况 (abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的 有效密码串吗?
输入:
测试数据有若干行字符串,包括字母,数字,符号。(字母区分大小写)
输出:
与输入相对应每一行输出一个整数,代表最长有效密码串的长度。
样例输入
ABBA
12ABBA
A
ABAKK
51233214
abaaab
样例输出
4
4
1
3
6
5
1 import java.util.Scanner; 2 public class Main { 3 public static int suanFa(int[][] arry,int i,int j,int flag){ 4 if(i<arry.length&&j<arry.length&&arry[i][j]==1){ 5 flag+=1; 6 arry[i][j]=0; 7 flag=suanFa(arry,i+1,j+1,flag); 8 } 9 return flag; 10 } 11 12 public static void main(String[] args){ 13 Scanner scan=new Scanner(System.in); 14 while(scan.hasNext()){ 15 16 String s=scan.nextLine(); 17 int arry[][]=new int[s.length()][s.length()]; 18 for(int i=0;i<s.length();i++){ 19 for(int j=s.length()-1,k=0;j>=0;j--,k++){ 20 if(s.charAt(i)==s.charAt(j)){ 21 arry[i][k]=1; 22 }else{ 23 arry[i][k]=0; 24 } 25 } 26 } 27 28 int flag=0,max=0; 29 for(int i=0;i<s.length();i++){ 30 for(int j=0;j<s.length();j++){ 31 if(arry[i][j]==1){ 32 max=Math.max(max, suanFa(arry,i,j,flag)); 33 flag=0; 34 arry[i][j]=0; 35 } 36 } 37 } 38 System.out.println(max); 39 } 40 } 41 }
解题思路:
最长公共子串