繁体   English   中英

在 Java 中检查字符串是否为回文

[英]Checking if a string is a palindrome in Java

我正在使用一个简单的函数来检查字符串是否是回文。 但是程序进入了无限循环。

public static boolean checkPalindrome(String s){

        boolean check = true;
        int mid = s.length()/2;
        int j = s.length() -1;
        int i = 0;
        if (s.length()%2 == 0) {
            while(i <= mid){
                if (s.charAt(i) != s.charAt(j)){
                    check = false;
                    j--;
                    i++;
                }
            }
        }else if(s.length()%2 != 0){
            while(i < mid +1 ){
                if (s.charAt(i) == s.charAt(j)){
                    check = false;
                    j--;
                    i++;
                }
            }
        }
        return check;

    }

您需要将 i 的增量和 j 的减量移出内部 if 条件,并且不会进入无限循环。

为什么不这样做:

String rev = new StringBuilder(s).reverse().toString();
return rev.equals(s);

或者:

int len = s.length();
for (int i = 0; i < len; i++)
    if (s.charAt(i) != s.charAt(len - i - 1)) return false;
return true;

试试下面的代码:

public class Palindrome {
private static Scanner input;

public static void main(String args[]) {
    System.out.print("Enter a string:");
    input = new Scanner(System.in);
    String str = input.nextLine();

    System.out.println(palindromeLoop(str));
    System.out.println(palindromeCheck(str));
    System.out.println(palindromeRecursion(str));
}

// Using StringBuffer
public static String palindromeCheck(String str) {
    StringBuffer strName = new StringBuffer(str);
    strName.reverse();

    if (strName.toString().equals(str)) {
        return "The String is a Palindrome";
    } else {
        return "Not a Palindrome!!!";
    }
}

// Using For-Loop
public static String palindromeLoop(String str) {
    String original = str;
    String reverse = "";

    for (int i = str.length() - 1; i >= 0; i--) {
        reverse = reverse + original.charAt(i);
    }

    if (original.equals(reverse)) {
        return "The String is a Palindrome";
    } else {
        return "Not a Palindrome!!!";
    }
}

// Using Recursion
public static String palindromeRecursion(String str) {
    if (str.length() <= 1) {
        return "The String is a Palindrome";
    } else if (str.charAt(0) != str.charAt(str.length() - 1)) // Base case
        return "Not a Palindrome!!!";
    else
        return palindromeRecursion(str.substring(1, str.length() - 1));
}
class CheckPalindrome {
    boolean isPalindrome(String text) {
        int i = 0;
        int j = text.length() - 1;
        while (i < j) {
            while (!Character.isLetter(text.charAt(i)) && i < j) {
                ++i;
            }
            while (!Character.isLetter(text.charAt(j)) && i < j) {
                --j;
            }
            if (Character.toLowerCase(text.charAt(i++)) != Character.toLowerCase(text.charAt(j--))) {
                return false;
            }
        }
        return true;
    }
}




 @Test
    public void isPalindrome() throws Exception {

        CheckPalindrome checkPalindrome = new CheckPalindrome();
        String text = "No, it is opposition";
        assertTrue(checkPalindrome.isPalindrome(text));

    }

您实际上只能通过使用for循环和几个lists来做到这一点,如下所示:

public class Palindrome {

    public static void main(String[] args) {

        String str = "racecar";
        isPalindrome(str);

    }

    public static boolean isPalindrome(String str) {

        // if number is odd
        if (str.length() % 2 != 0) {
            List<String> counter = new ArrayList<>();

            for (int i = 0; i <= (str.length() - 1) / 2; i++) {
                for (int j = str.length() - 1; j >= (str.length() - 1) / 2; j--) {
                    if (str.charAt(i) == str.charAt(j)) {
                        counter.add("+");
                    }

                }
            }
            System.out.println(counter.toString());
            if (counter.size() == (str.length() + 1) / 2) {
                System.out.println("String is an odd palindrome");
            } else
                System.out.println("String is not a palindrome");
        }
        // if number is even
        else {
            List<String> counter_even = new ArrayList<>();

            for (int i = 0; i < (str.length()) / 2; i++) {
                for (int j = str.length() - 1; j >= (str.length()) / 2; j--) {
                    if (str.charAt(i) == str.charAt(j)) {
                        counter_even.add("+");
                    }

                }
            }
            System.out.println(counter_even.toString());
            if (counter_even.size() == (str.length()) / 2) {
                System.out.println("String is an even palindrome");
            } else
                System.out.println("String is not a palindrome");
        }
        return false;

    }

}

在这里,我们基本上拆分我们的字符串并将其前半部分与后半部分进行比较。 如果它们彼此相同,那么我们通过为两半的每个相同字母添加“+”来增加我们的列表。 如果我们的列表中'+'的数量(可以用任何随机字母替换,只要它有助于我们计数)等于我们奇数字符串的(str.length() + 1) / 2的结果,或等于(str.length()) / 2对于我们的偶数字符串,那么我们可以得出结论,我们的 String 是一个回文。

没有必要做这样困难的循环。 像这样的事情会起作用:

boolean isPalindrome(String s) {
   for (int i = 0; i < s.length()/2; i++) {
      if (s.charAt(i) != s.charAt(s.length() - i - 1)) return false;
   }

   return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM