寻找字典序最小的回文

Finding the lexicographically smallest palindrome

我写了下面的代码,输出也是按要求来的。然而,当我在网站上提交我的代码时,它总是最终显示答案是错误的。 任何人都可以找到任何可能导致错误的错误(我看不到任何错误)。

任务是将给定的字符串转换为回文(如果可能的话)。输入格式为

a.bc    
.aacc   

上面的输出是-1,两次因为字符串不能转换成回文,无论你在.

的地方保留什么

这是我的代码:

import java.util.*; 
 class m
{
static int p,o,k,m;
public static void main(String args[])
{
  String a[] = new String[500];
  int e[] = new int[500];
int i,j;
 m o = new m();
Scanner s = new Scanner(System.in);

int n = s.nextInt();

for(i=0;i!=n;i++)
{
    a[i] = s.next();

}

//FOR CHECKING NUMBER OF PAIRS
for(i = 0 ; i < n ; i++)
{
    p=0;
    for(j = 0 ; j < a[i].length() ; j++)
    {
    if(a[i].charAt(j) == a[i].charAt(a[i].length() - 1 - j))
        {
            ++p;
        }
    }
    e[i] = p;
}


//IF STRING LENGTH IS EVEN

    for(i = 0 ; i < n ; i++)
 {
  for(j = 0 ; j < a[i].length() ; j++)
    {

      if(a[i].length()%2 == 0)
      {
         if(e[i] == (a[i].length() - 2))
         {
 String h = a[i].replace('.',a[i].charAt(a[i].length() - 1 - a[i].indexOf('.')));
             System.out.println(h);
             break;
         }               
         else
         {
             System.out.println("-1");
             break;
         }
      }
 //IF STRING LENGTH IS ODD        
      else
      {
          if(a[i].indexOf('.') == (((a[i].length() + 1 ) / 2 ) - 1))
          {
              if(e[i] == (a[i].length() ))
              {   
                  String g = a[i].replace('.','a');
                  System.out.println(g);
                  break;
              }

              else
              {
                  System.out.println("-1");
                  break;
              }
          }

        else if(e[i] == (a[i].length() - 2))                
        {
            String q = a[i].replace('.',a[i].charAt(a[i].length() - a[i].indexOf('.') - 1));
            System.out.println(q);  
            break;
        }

        else
        {
            System.out.println("-1");
            break;
        }
      }
    }             
    }

更新后的:

 import java.util.*;
import java.lang.*;
class m
{
    public static void main(String args[])
  {
      int i,j;
    Scanner r = new Scanner(System.in);
    char b[][] = new char [50][50];
    String a[] = new String [12345];
    int n = r.nextInt();

    for( i = 0 ; i < n ; i++)
    {
        a[i] = r.next(); 
        if(a[i] == " ")
            a[i] = null;
    }       

    //FOR INITIALISING THE ARRAY
    for(i = 0 ; i < n ; i++)
    {
        for( j = 0 ; j < a[i].length() ; j++)
        {
            b[i][j] = a[i].charAt(j);
        }
    }

  int ll;
  int pp = 0;
  for(i=0;i<n;i++)
  {
      int lena = a[i].length();
      pp = lena;
      ll = 0;
      for(j=0;j<(lena/2);j++)
      {
          if(b[i][j] == b[i][lena-1-j])
              ++ll;
           //System.out.println("ITS WORKING" +pp);
      }
      if(ll == pp/2)
  {
      System.out.println("-1");
     // System.exit(0);
      break;
  }
  }
  // System.out.println("ITS WORKING" +count);

  //FOR PRINTING THE array
 /* for(i = 0 ; i < n ; i++)
  {
      for(j= 0 ; b[i][j]!='[=12=]' ; j++)
      {
          System.out.println(b[i][j]);
      }
  }*/

  for(i = 0 ; i < n ; i++)
    {
    int len = a[i].length();
    for( j = 0 ; j < len/2 ; j++)
        {
            if(len%2 == 0)
            {
                if(b[i][j] == '.' && b[i][len-1-j] == '.')
                    b[i][j] = b[i][len-1-j] = 'a';

                else if(b[i][j] == '.' &&  b[i][len-1-j]!='.' ) 
                    b[i][j] = b[i][len-1-j];

                else if (b[i][j]!= '.' &&  b[i][len-1-j] == '.')
                    b[i][len-1-j] = b[i][j];

                else{
                    if(b[i][j] == b[i][len-1-j])
                        continue;
                    else
                    {
                        System.out.println("-1");
                        //System.exit(0);
                    //  hh = false;
                        break;
                    }
                    }
            }

            else if(len%2!=0)
            {
                if(b[i][(len-1)/2] == '.')
                    b[i][(len-1)/2] = 'a';
                else
            {

                if(b[i][j] == '.' && b[i][len-1-j] == '.')
                {
                    b[i][j] = b[i][len-1-j] = 'a';
                    //System.out.println("ITS WORKING");
                }

                else if(b[i][j] == '.' &&  b[i][len-1-j]!='.' )
                    b[i][j] = b[i][len-1-j];

                else if (b[i][j]!= '.' &&  b[i][len-1-j] == '.')
                    b[i][len-1-j] = b[i][j];

                else{
                    if(b[i][j] == b[i][len-1-j])
                        continue;
                    else
                    {
                        System.out.println("-1");
                        //System.exit(0);
                    //  hh = false;
                        break;
                    }
                    }
            }
            }


        }
    }

    for(i = 0 ; i < n ; i++)
  {
      for(j= 0 ; b[i][j]!='[=12=]' ; j++)
      {
          System.out.print(b[i][j]);
      }
      System.out.println();
  }

}
}

当我 运行 你的代码时,它似乎在正好包含 1 个点的输入上按预期工作。如果没有点(例如 abba)或多于一个点(ab..),它似乎总是打印 -1。我无法判断这是否符合预期(正如您的网站所期望的那样!)。这是我对可能出错的最佳猜测。

要处理一个以上的点,如果是我我会:

  1. 将字符串转换为可以修改的内容,例如 StringBuffer、StringBuilder 或 char 数组。
  2. 只循环遍历单词的前半部分,始终查看当前字符和从另一端开始计数的相同位置的字符(您已经有了公式:a[i].length() - 1 - j)。如果都是点,两处都填'a';如果一个是点,从相反的位置复制字母;如果 none 是一个点,它们必须相同,或者您可以打印 -1 并跳出循环(或者更好,设置一个布尔变量以指示构造回文失败)。
  3. 如果中间位置有一个点(只有奇数长度可能),将其替换为'a'。
  4. 如果到目前为止成功,打印修改后的单词。除了没有点的情况:如果单词仍然与输入相同,也打印 -1。

如果您需要进一步的帮助。我相信我们需要更精确的问题陈述,更精确的程序要求。