题目描述:
解题思路:
将输入的字符串逆序,求其和原字符串的最长公共子序列的长度。
知识点:
最长公共子序列求解。
学习参考:https://www.cnblogs.com/xudong-bupt/archive/2013/03/15/2959039.html
- 一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串。
- 最长公共子序列,是指多个字符串可具有的长度最大的公共的子序列。
动态规划求最长公共子序列的长度
动态规划采用二维数组来标识中间计算结果,避免重复的计算来提高效率。
字符串str = “abcda”,其逆序reStr = “adcba”
图示二维矩阵的变化:
import java.util.Scanner;
public class huiwenStr {
public static int LCS(String str) {
char[] strC = str.toCharArray();
char [] reStr = new char[strC.length];
//str逆序
int x=strC.length-1;
for(int j=0;j<reStr.length;j++) {
reStr[j]=strC[x];
x--;
}
int [][] num= new int[str.length()+1][str.length()+1];
//初始化第一行和第一列元素为0
for(int i =0;i<str.length()+1;i++) {
num[0][i] = 0;
num[i][0] =0;
}
for(int i=1;i<str.length()+1;i++) {
for(int j=1;j<str.length()+1;j++) {
if(strC[i-1]==reStr[j-1]) {
num[i][j] = num[i-1][j-1]+1;
}else if(num[i][j-1]>num[i-1][j]){
num[i][j] = num[i][j-1];
}else {
num[i][j] = num[i-1][j];
}
}
}
int large = num[str.length()][str.length()];
return str.length()-large;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String str = in.nextLine();
System.out.println(LCS(str));
}
}
}