寻找字典序最小的回文
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。我无法判断这是否符合预期(正如您的网站所期望的那样!)。这是我对可能出错的最佳猜测。
要处理一个以上的点,如果是我我会:
- 将字符串转换为可以修改的内容,例如 StringBuffer、StringBuilder 或 char 数组。
- 只循环遍历单词的前半部分,始终查看当前字符和从另一端开始计数的相同位置的字符(您已经有了公式:
a[i].length() - 1 - j
)。如果都是点,两处都填'a';如果一个是点,从相反的位置复制字母;如果 none 是一个点,它们必须相同,或者您可以打印 -1 并跳出循环(或者更好,设置一个布尔变量以指示构造回文失败)。
- 如果中间位置有一个点(只有奇数长度可能),将其替换为'a'。
- 如果到目前为止成功,打印修改后的单词。除了没有点的情况:如果单词仍然与输入相同,也打印 -1。
如果您需要进一步的帮助。我相信我们需要更精确的问题陈述,更精确的程序要求。
我写了下面的代码,输出也是按要求来的。然而,当我在网站上提交我的代码时,它总是最终显示答案是错误的。 任何人都可以找到任何可能导致错误的错误(我看不到任何错误)。
任务是将给定的字符串转换为回文(如果可能的话)。输入格式为
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。我无法判断这是否符合预期(正如您的网站所期望的那样!)。这是我对可能出错的最佳猜测。
要处理一个以上的点,如果是我我会:
- 将字符串转换为可以修改的内容,例如 StringBuffer、StringBuilder 或 char 数组。
- 只循环遍历单词的前半部分,始终查看当前字符和从另一端开始计数的相同位置的字符(您已经有了公式:
a[i].length() - 1 - j
)。如果都是点,两处都填'a';如果一个是点,从相反的位置复制字母;如果 none 是一个点,它们必须相同,或者您可以打印 -1 并跳出循环(或者更好,设置一个布尔变量以指示构造回文失败)。 - 如果中间位置有一个点(只有奇数长度可能),将其替换为'a'。
- 如果到目前为止成功,打印修改后的单词。除了没有点的情况:如果单词仍然与输入相同,也打印 -1。
如果您需要进一步的帮助。我相信我们需要更精确的问题陈述,更精确的程序要求。