一个词内最长的回文

时间:2017-02-07 17:00:43

标签: java

我正在尝试制作一个程序来找到字符串中最长的回文。

例如,香蕉 - >阿纳纳

我做了一个for循环来反转输入的字符串,我可以每次检查它是否是回文但是我不确定它是否会起作用,因为回文可能不会从字符串的第一个字母开始。

现在,我的节目输出如下:

a
an
ana
anan
anana
ananab

在这种情况下,它会起作用,但如果输入是abracadabra,则其中的两个回文将是aceada,但程序无法正确找到它。< / p>

这是我的代码:

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

        String string = "banana";
        String reverse = "";
        int length = string.length() - 1;

        for (int i = length; i >= 0; i--) {

            reverse = reverse + string.charAt(i);

            System.out.println(reverse);

        }

    }
}

我真的很感激一些帮助。

1 个答案:

答案 0 :(得分:0)

@ user7455531,我从你的next question收集你现在解决了你的问题。我只想将我的评论发展成为其他人一起阅读的完整解决方案。 “[我]创建编程资源的精神,您可以在适当的时间后回来并编辑您的回复以包含更完整的代码”,如How do I ask and answer homework questions?中所述

我的方法考虑输入字符串的所有可能的子字符串。对于每个子字符串,它使用StringBuilder.reverse()来反转子字符串,然后将其与原始子字符串进行比较,以确定它是否为回文。

private static Collection<String> longestPalindromesIn(String input) {
    // longest palindromes found until now
    Set<String> result = new HashSet<>();
    // length of longest palindrome found until now (all strings in result have this length)
    // initialize to a negative value to make sure that the first palindrome found will appear to be longer
    int longest = -1;
    // iterate over all possible substrings
    for (int start = 0; start <= input.length(); start++) {
        for (int end = start; end <= input.length(); end++) {
            String currentSubstring = input.substring(start, end);
            // only consider if at least as long as the longest palindrome already found
            if (currentSubstring.length() >= longest) {
                if (isPalindrome(currentSubstring)) {
                    if (currentSubstring.length() > longest) {
                        // discard palindromes shorter than the one we have just found
                        result.clear();
                        longest = currentSubstring.length();
                    }
                    result.add(currentSubstring);
                } 
            }
        }
    }
    return result;
}

private static boolean isPalindrome(String candidate) {
    // the following is the easy way of reversing a string;
    // you may use your own code instead if you prefer
    StringBuilder reverse = new StringBuilder(candidate);
    reverse.reverse();
    return candidate.equals(reverse.toString());
}
  • 对于输入banana,该方法返回一组单个字符串anana
  • abracadabra提供两个回文,acaada
  • abca提供abc。如果没有有趣的回文(长度为2或更长),则该方法只返回每个字母。每个,因为resultSet,因此过滤掉重复项。
  • 如果输入为空字符串"",则输出也是空字符串。毕竟这是一个回文。

有优化的空间(让代码运行得更快),但我认为没有必要,所以为什么要这么麻烦?