找到按字典顺序排列的最小回文

时间:2016-09-12 08:02:08

标签: java palindrome

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

任务是将给定的字符串转换为回文结构(IF POSSIBLE)。输入格式为

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]!='\0' ; 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]!='\0' ; j++)
      {
          System.out.print(b[i][j]);
      }
      System.out.println();
  }

}
}

1 个答案:

答案 0 :(得分:1)

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

要处理多个点,如果是我,我会:

  1. 将String转换为可以修改的内容,如StringBuffer,StringBuilder或char数组。
  2. 仅循环显示单词的前半部分,始终查看当前字符和位于另一端的相同位置的字符(您已经有公式:a[i].length() - 1 - j)。如果两者都是点,请填写&#39; a&#39;在这两个地方;如果一个是圆点,则从相反位置复制该字母;如果没有一个点,它们必须是相同的,或者你可以打印-1并打破循环(或者更好的是,设置一个布尔变量来指示无法构建回文)。
  3. 如果中间位置有一个点(只能使用奇数长度),请将其替换为&#39; a&#39;。
  4. 如果到目前为止成功,请打印修改过的单词。除了无点情况:如果单词仍然与输入相同,则也打印-1。
  5. 如果您需要进一步的帮助。我相信我们需要一个更准确的问题陈述,更精确的程序要求。