题目描述
给定一个字符串,问是否能通过添加一个字母将其变为回文串。
输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于10。
输出描述:
输出答案(YES\NO).
示例1
输入
coco
输出
YES
解题思路:字符串的反转之后字符串的最长公共子序列长度和原长度差值小于等于1
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String s = sc.nextLine();
String s1 = new StringBuilder(s).reverse().toString();
int len = s.length();
int len1 = gongGongzixulie(s,s1);
if(len-len1<=1){
System.out.println("YES");
}else {
System.out.println("NO");
}
}
}
//dp[i][j]表示字符串1长度为i和字符串2长度j的最长公共子序列
private static int gongGongzixulie(String s, String s1) {
if(s == null || s1 == null)
return 0;
int [][]dp = new int[s.length()+1][s1.length()+1];
dp[0][0] = 0;
for(int i = 0;i<s.length();i++){
dp[0][i] = 0;
}
for(int j =0;j<s.length();j++){
dp[j][0] = 0;
}
for(int i = 1;i<s.length()+1;i++){
for(int j = 1;j<s.length()+1;j++){
if(s.charAt(i-1) == s1.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;
}else {
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[s.length()][s1.length()];
}
}