题目一:构造回文
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子:
abcda google
输出例子:
2 2
解析:求原串和其反串的最大公共子序列,最大的子序列长度即为原串所能构成的最大回文串长度。
//即求原串和反串的LCS
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s1="";
while((s1=br.readLine())!=null)
{
String s2=new StringBuilder(s1).reverse().toString();
int[][]dp=new int[s1.length()+1][s2.length()+1];
//dp[i][j]表示s1长度为i,s2长度j时的LCS长度
//初始化,默认全为0
for(int i=1;i<=s1.length();i++)
{
for(int j=1;j<=s2.length();j++)
{
if(s1.charAt(i-1) == s2.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]);
}
}
}
System.out.println(""+(s1.length()-dp[s1.length()][s2.length()]));
}
br.close();
}
}
题目二:字符移位
小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗?
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出移位后的字符串。
输入例子:
AkleBiCeilD
输出例子:
kleieilABCD
import java.io.*;
public class Main{
public static void main(String[] args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s="";
while((s=br.readLine())!=null)
{
char[] ch=s.toCharArray();
for(int i=0;i<ch.length;i++)
{
if(ch[i]>='A'&&ch[i]<='Z')
{
int j=i+1;
for(;j<ch.length;j++)
{
if(ch[j]>='a'&&ch[j]<='z'){
break;
}
}
if(j == ch.length){
break;
}
char temp=ch[j];
while(j > i)
{
ch[j]=ch[j-1];
j--;
}
ch[i]=temp;
}
}
System.out.println(String.valueOf(ch));
}
br.close();
}
}
题目三:有趣的数字
狗不拉屎