Java - LONG字符串的单词回文

时间:2014-08-16 20:15:52

标签: java palindrome

所以,我正在做这个名为valid palindrome的挑战,我被困住了。

我的代码适用于小/中等字符串但是当它运行时,我收到Time Limit Exceeded消息,这意味着必须有更好的方法来优化我的代码。

我正在考虑使用charAt()并执行类似...因为它是一个回文...将它分成两半并快速检查for循环中的对立角色但是我&#39我被困在这里。

/**
 *  Palindrome Word Checker
 *  Tests to see if an input phrase is a
 *  palindrome (read the same if read backward and forwards)
 */

import java.util.Scanner;

public class wordPalindrome {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System. in );
        System.out.println("Palindrome Word Checker\nEnter a phrase, please:");

        String theWord = "";

        while (true) {
            theWord = scanner.nextLine();
            System.out.println(theWord + ": " + wordPalindrome(theWord));
        }
    }
    public static boolean wordPalindrome(String word) {

        // SECONDLY, we check to see how we much of the word
        // is left until verification. We check first to prevent
        //  array (out of bounds) exception errors.


        if (word.length() == 0 || word.length() == 1) return true;

        // FIRST we take the last letter and compare it to the first letter
        // if it matches, then we move onward and return to the function
        // with a new word. By substring(), we take off the first/last letters
        // and we keep repeating this process until the length is
        // at 0 or 1 for odd/even lengthed words to verify its status
        if (word.charAt(word.length() - 1) == word.charAt(0))
            return wordPalindrome(word.substring(1, word.length() - 1));

        // if we fail to make an ID, then it's obviously
        // not a palindrome and we return false
        return false;
    }
}

这是"字符串"他们用来破坏我的程序:pastebin。我如何承受那么长的弦?我显然不能使用String,因为它太长了......信息太多了。

5 个答案:

答案 0 :(得分:1)

比递归更好的方法是迭代过程。您可以使用charAt和一个循环来处理字符串的一半而另一半同时处理。我不会编码,但我会尝试使用伪代码。我建议用Java编写它作为对自己的挑战:

  1. 确定字符串的长度
  2. 将计数器(i)初始化为0.
  3. 虽然我小于长度减去i,但重复以下步骤:
    1. 如果第i个字符不等于(length-i)字符,则立即返回false。
  4. 一旦循环结束,返回true(因为没有发现故障)。

答案 1 :(得分:1)

您可能应该遵循hexafraction的建议并尝试自己编写代码。如果您对编码挑战感兴趣,例如您现在正在努力解决的问题,您还可以访问:

以防万一应该通过回文任务的解决方案:

public boolean isPalindrome(String s) {
    s = s.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
    int b = 0;
    int e = s.length()-1;

    while(b < e) {
        if(s.charAt(b++) != s.charAt(e--))
            return false;
    }
    return true;
}

答案 2 :(得分:0)

不要为此使用递归。

只需替换下面的

if (word.charAt(word.length() - 1) == word.charAt(0))
    return wordPalindrome(word.substring(1, word.length() - 1));

用这个

int length = word.length();
for(int i = 0; i < length / 2; i++) {
    if(word.charAt(i) != word.charAt(length - i - 1)){
        return false; // not palindrome
    }
}
return true; // palindrome

答案 3 :(得分:0)

也可以使用StringBuilder

StringBuilder sb = new StringBuilder();
sb.append(word);
return sb.equals(sb.reverse());

快速高效。

答案 4 :(得分:0)

使用 java.io 包。 然后你可以使用以下代码行:

StringBuffer str = new StringBuffer(theWord).reverse();  
if (theWord.equals(str)) {  
System.out.println("Palindrome");  
}  
else {  
System.out.println("Not Palindrome");  
}