最长回文子串
时间限制:1000 ms  |  内存限制:65535 KB 
难度:4
描述 
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。
输入
输入一个测试数据n(1<=n<=10);
随后有n行,每行有一个字符串。
输出
输出所要求的回文子串。
样例输入
1
Confuciuss say:Madam,I'm Adam.
样例输出
Madam,I'm Adam上面的是题目
以下是我的代码:import java.util.*;
public class Main { /**
 * @param args
 */


public static void main(String[] args)throws Exception
 {
// TODO 自动生成方法存根
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();

while(n--!=0)
{
Scanner sc2=new Scanner(System.in);
String s = sc2.nextLine();
int c=0;
int[] c1=new int[5001];

char[] c2=new char[5001];

for(int i=0;i<s.length();i++)
{
char temp=s.charAt(i);

if(Character.isLetter(temp))
{
c1[c]=i;
if(Character.isUpperCase(temp))
{

temp=Character.toLowerCase(temp);
}
c2[c++]=temp;
}
}

int begin=0;
int end=0;
int max=0;
for(int i=0;i<c;i++)
{
for(int j=i;j<c;j++)
{
boolean p=true;
for(int k=i;k<=(i+j)/2;k++)
{

if(c2[k]!=c2[j-k+i])
{
p=false;
break;
}
}
if(p)
{

if(j-i+1>max)
{
max=j-i+1;
begin=i;
end=j;
}
}
}
}

System.out.println(s.substring(c1[begin],c1[end]+1));

}

}

}          哪位大侠帮帮小弟!              

解决方案 »

  1.   

    没有啊,按照输入来,是没问题的:2
    Confuciuss say:Madam,I'm Adam.
    Madam,I'm Adam
    Confuciuss say:Madam,I'm Adam.
    Madam,I'm AdamLZ想表达什么
      

  2.   

    做ACM题,提交之后总是判断我做错了,可是觉得没问题呀?
      

  3.   


         
    import java.util.*;
    public class Main { /**
     * @param args
     */


    public static void main(String[] args)throws Exception
     {
    // TODO 自动生成方法存根
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();

    while(n--!=0)
    {
    Scanner sc2=new Scanner(System.in);
    String s = sc2.nextLine();
    int c=0;
    int[] c1=new int[s.length()];

    char[] c2=new char[s.length()];

    for(int i=0;i<s.length();i++)
    {
    char temp=s.charAt(i);

    if(Character.isLetter(temp))
    {
    c1[c]=i;
    if(Character.isUpperCase(temp))
    {

    temp=Character.toLowerCase(temp);
    }
    c2[c++]=temp;
    }
    }

    int begin=0;
    int end=0;
    int max=0;
    for(int i=0;i<c;i++)
    {
    for(int j=i;j<c;j++)
    {
    boolean p=true;
    for(int k=i;k<=(i+j)/2;k++)
    {

    if(c2[k]!=c2[j-k+i])
    {
    p=false;
    break;
    }
    }
    if(p)
    {

    if(j-i+1>max)
    {
    max=j-i+1;
    begin=i;
    end=j;
    }
    }
    }
    }

    System.out.println(s.substring(c1[begin],c1[end]+1));

    }

    }

    }