【问题标题】:recursive method that checks if a string is palindrome in javajava中检查字符串是否为回文的递归方法
【发布时间】:2021-12-15 21:15:02
【问题描述】:

输入:“mnkknm”,其中 n=0 输出:标志总是等于 1 而它应该等于 3 它返回-1 问题是什么 ? 注意:回文意味着例如,如果马拉雅拉姆语的反向也是 马拉雅拉姆语然后它的回文 另一个注意事项:我应该递归编写代码,因为这是一项家庭作业

public static int PalindromeCheck(String x , int n) 
{

int flag =0;
if (n+1 !=x.length()/2)
{
char s = x.charAt(n);
char y = x.charAt(x.length()-1-n);
if (s==y)
{    flag++;
System.out.println(flag); // i write it to check the value of the flag
}

return  flag+PalindromeCheck(x,n+1) ;
}

if (flag==x.length()/2)
{
return 1;}
else{
return -1;
}

【问题讨论】:

  • 为什么需要递归方法呢?很简单,将字符串对半分割,然后取另一半,反转并比较。
  • @Victor 或者只是迭代前半部分,并测试每个字符是否与右侧的相应索引(从长度偏移)匹配。
  • @ElliottFrisch 或者只迭代字符的前半部分,异或它们,迭代后半部分,异或它们并进行比较!与二进制比较一样快!
  • @Victor AFAIK XOR 不起作用 - 是否考虑订购? ("abab" 不是回文) |许多值将创建相同的 XOR 值(例如 'a' ^ 'g' == 'b' ^ d' == 'c' ^ 'e'
  • 或者只是反转字符串并检查它是否等于原始字符串。虽然最好在没有案例的情况下进行比较。

标签: java


【解决方案1】:

请试试这个方法

public static boolean isPal(String s)
{
    if(s.length() == 0 || s.length() == 1) {
        return true;
    }
    if(s.charAt(0) == s.charAt(s.length()-1)) {

        return isPal(s.substring(1, s.length() - 1));
    }
    return false;
}

【讨论】:

  • 请使用 方括号 表示 if 语句,即使它只有一行。
【解决方案2】:

首先,我将使用该递归签名创建一个帮助方法(公共函数应该只采用String)。我们可以在那里测试null 和空字符串作为特殊情况。喜欢,

public static boolean isPalindrome(String x) {
    if (x == null) {
        return false;
    } else if (x.isEmpty()) {
        return true;
    }
    return isPalindrome(x, 0);
}

那么您当前的方法似乎很接近,但您想将带有小于运算符的nx 长度的一半进行比较。然后在右侧测试字符是否匹配(从x.length() 偏移n,但我们需要-1,因为基于零的索引)。此外,该方法应该返回一个boolean(我修复了名称)。喜欢

private static boolean isPalindrome(String x, int n) {
    if (n < x.length() / 2) {
        if (x.charAt(n) != x.charAt(x.length() - n - 1)) {
            return false;
        }
        return isPalindrome(x, n + 1);
    }
    return true;
}

【讨论】:

    【解决方案3】:

    我会先做 2 或 3 次快速检查:

    1. 如果第一个字符与最后一个字符不匹配。这可以节省大量时间而无需反转任何内容,尤其是当输入非常长时

    2. 然后让它找出任何与第一个不同的字符。如果不是,则该字符串已经是同一字符的不间断链,那么它一定是回文。

    3. (可选)如果输入真的很长,快速检查相同第一个字符的组件分布 - 根据回文的定义,

    如果长度是偶数,那么该字符的出现次数必须也是偶数。

    如果长度是奇数,那么它应该是偶数,除非完全中心的字符也是同一个,否则你会知道分布在左右之间已经不平衡了,那么反转它有什么意义呢?此时你可以返回 false 并节省时间。

    如果两者都通过,则按照其他人的建议进行操作:反转右侧一半并检查它是否与最左侧的索引位置对齐(0 或 1 取决于哪种语言)。冲销部分不必做任何这些小检查。高速倒车即可。

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2012-07-14
      • 2016-01-31
      • 1970-01-01
      • 2013-02-02
      • 2012-04-05
      相关资源
      最近更新 更多