我正在尝试制作一个程序来找到字符串中最长的回文。
例如,香蕉 - >阿纳纳
我做了一个for循环来反转输入的字符串,我可以每次检查它是否是回文但是我不确定它是否会起作用,因为回文可能不会从字符串的第一个字母开始。
现在,我的节目输出如下:
a
an
ana
anan
anana
ananab
在这种情况下,它会起作用,但如果输入是abracadabra
,则其中的两个回文将是ace
和ada
,但程序无法正确找到它。< / 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);
}
}
}
我真的很感激一些帮助。
答案 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
提供两个回文,aca
和ada
。abca
提供a
,b
和c
。如果没有有趣的回文(长度为2或更长),则该方法只返回每个字母。每个,因为result
是Set
,因此过滤掉重复项。""
,则输出也是空字符串。毕竟这是一个回文。有优化的空间(让代码运行得更快),但我认为没有必要,所以为什么要这么麻烦?