題目描述
給定一個字符串,問是否能通過添加一個字母將其變爲迴文串。
輸入描述:
一行一個由小寫字母構成的字符串,字符串長度小於等於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()];
}
}