理解题意很重要尤其是这种题,如果遇见这种题说了很多别的术语,别的不要管直接看最后一句。给你两个序列,找出最长的公共序列,结合前文简单一看就知道是给你两个字符串,找出大写字母开头且相同的字符串,大写字母后不限定必须紧跟之前的字母(可以跳着选取)——最长不连接子序列,那么首先我们必须处理好字符串,然后使用动态规划的方式寻找最长子序列。
①接收两个字符串
②对两组字符串进行处理
③每一个大写字母开头的字符串存储到新的字符数组中
④使用动态规划寻找最长子序列(***)
⑤输出结果
代码如下
int size=(int) (1e3+5);
Scanner scanner=new Scanner(System.in);
String s1=scanner.nextLine();
String s2=scanner.nextLine();
char[] char1 = s1.toCharArray();
char[] char2 = s2.toCharArray();
String[] s3=new String[size];
String[] s4=new String[size];
int count1=0;
for (int i = 0; i < char1.length; i++) {
if (char1[i]>='A' && char1[i]<='Z') {
count1++;
}
s3[count1]+=char1[i];//得到第一个字符串的蓝太子序列
}
int count2=0;
for (int i = 0; i < char2.length; i++) {
if (char2[i]>='A' && char2[i]<='Z') {
count2++;
}
s4[count2]+=char2[i];//得到第二个字符串的蓝太子序列
}
int[][] arr=new int[count1+1][count2+1];
for (int i = 1; i <= count1; i++) {
for (int j = 1; j <= count2; j++) {
if (s3[i].equals(s4[j])) {//进行对比
arr[i][j]=arr[i-1][j-1]+1;//构成子序列在前一个基础上+1
}else {
arr[i][j]=Math.max(arr[i-1][j],arr[i][j-1]);//不能构成子序列选取两个中的最大值
}
}
}
System.out.println(arr[count1][count2]);
scanner.close();
}
第一个开始一定为0。状态①多一个则在原来的状态+1,状态②不同则取之前的最大值