java中的字符串回文



问题的约束条件为:第一行包含两个整数N和LN表示人数,L表示Palindrome中人名的最大长度。接下来的N行中的第i行包含一个字符串S,表示第i个人的姓名。它们可以通过选择最多两个与自己同名的不重叠的子字符串并反转它们来做到这一点。

我的代码编译正确,但给出运行时错误:所以需要改变什么?下面是我的代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
class Palindrome {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        {
            String line = br.readLine();
            int N = Integer.parseInt(line);
            int l = Integer.parseInt(line);
            String a[] = new String[N];
            int c = 0;
            for (int i = 0; i < N; i++) {
                System.out.println("Enter names");
                a[i] = br.readLine();
            }
            String reverse[] = new String[N];
            int arrayLength = a.length;
            for (int i = arrayLength - 1; i >= 0; i--) {
                reverse[i] = reverse[i] + a[i].charAt(i);
            }
            if (Arrays.equals(a, reverse)) //if (a[i].equals(reverse[i]))
            {
                c++;
                System.out.println(c);
            }
        }
    }
}

我需要打印可以将姓名更改为回文格式的人数。

的例子:

Input:        
   4 10            
   aacbaac
   acbdabc
   abcdcba
   abcbd

output:
   3

这里4表示总人数10表示每个人名的最大长度

输出为3,因为只有前3个人可以将他们的名字更改为各自的形式。

您遇到的一个问题是,您定义了一个字符串数组,但是您试图将字符传递给它。你应该把String reverse[] =new String[N]; 变成Char reverse[] =new Char[N];

同样,reverse[i] = reverse[i] + a[i].charAt(i);应该是reverse[i] = a[i].charAt(i);

我认为这是Codechef的问题。代码中的主要问题是在将值分配给Nl的部分。注意,在line中只接受一次输入,然后将其整数值赋给Nl。所以,问题是您的程序没有接受预期的输入:您必须在line 中接受两次输入。将该部分更改为

String line = br.readLine();
int N = Integer.parseInt(line);
line = br.readLine(); //add this line before assigning l's value
int l= Integer.parseInt(line);

此外,当你在循环中寻找字符串的反转时,你试图做的事情应该在嵌套循环结构中完成。为了避免这种复杂性,忘记第二个reverse数组;您可以使用以下一行语句来检查回文字符串:

for(int i=0; i<a.length; i++){
    if(String.valueOf(new StringBuffer(a[i]).reverse()).equalsIgnoreCase(a[i]))
        //a[i] is a palindrome, do whatever you want to
}

将其传递给StringBuilder以便反转它。查看下面的代码:

   public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
        int N = Integer.parseInt(line);
        int l = Integer.parseInt(line);
        String a[] = new String[N];
        int c = 0;
        for (int i = 0; i < N; i++) {
            System.out.println("Enter names");
            a[i] = br.readLine();
        }
        String reverse[] = new String[N];
        int arrayLength = a.length;
        for (int i = arrayLength - 1; i >= 0; i--) {
            StringBuilder build = new StringBuilder(a[i]);
            reverse[i] = build.reverse().toString();
            if (a[i].equals(reverse[i])) {
                c++;
            }
        }
        System.out.println("Pal is " + c);
    }

我不知道你在使用int变量l做什么,但是修改它就像我上面用N做的那样。