我最近写了这个简短的方法来确定字符串是否是回文。我想知道如何做才能使其更高效,肯定会丢失一些简单的内置函数来加快计算速度。
谢谢大家的帮助!
boolean checkPalindrome(String inputString) {
ArrayList<Character> arrFront = new ArrayList<Character>();
ArrayList<Character> arrBack = new ArrayList<Character>();
for(int i=0; i<inputString.length()-1; i++) {
arrFront.add(inputString.charAt(i));
}
for(int i=inputString.length()-1; i>0; i--) {
arrBack.add(inputString.charAt(i));
}
StringBuilder builder1 = new StringBuilder(arrFront.size());
for (Character c : arrFront) {
builder1.append(c);
}
String front = builder1.toString();
StringBuilder builder2 = new StringBuilder(arrBack.size());
for (Character c : arrBack) {
builder2.append(c);
}
String back = builder2.toString();
return(front.equals(back));
}
答案 0 :(得分:5)
就效率而言,它并不总是与内置函数和使用库有关(尽管在许多情况下,它们是最佳选择)。但是有时候,这样的简单循环可能是最简单,最有效的方法:
private boolean checkPalindrome(String inputString) {
for(int i = 0, j = inputString.length() - 1; i < j; i++, j--) {
if(inputString.charAt(i) != inputString.charAt(j)) {
return false;
}
}
return true;
}
答案 1 :(得分:0)
可以参考@FernandoPelliccioni的文章Check string for palindrome。他对此解决方案进行了非常详尽的分析。
简单的解决方案:
public static boolean isPalindrome(String str) {
return str.equals(new StringBuilder(str).reverse().toString());
}
关于效率:
public static boolean isPalindrome(String str) {
int n = str.length();
for (int i = 0; i < n/2; ++i) {
if (str.charAt(i) != str.charAt(n-i-1)) return false;
}
return true;
}
答案 2 :(得分:0)
这是一种更简单的方法。
public boolean checkPalindrome(String str) {
int len = inputString.length()/2;
for(int i = 0 ; i < len ; i++) {
if(str.charAt(i) != str.charAt(str.length()-1-i)) {
return false;
}
}
return true;
}
当str的长度为N
时。时间复杂度为O(N/2)
。
注意:当str的长度为奇数时,不需要检查中间字符,因为它本身就是
例如,
在ssstsss
中,您不需要检查t
。
并且由于len
是int。它不能表达decimal part
。它会自动下降。
len
中的ssstsss
之所以是3
,是因为它是7/2 = 3.5
并丢弃了0.5
。
即使长度是偶数,它也可以工作。例如,abccba
。长度为6
。 len
是3
。如果长度为偶数,则必须检查中间的两个字符,即cc
。
答案 3 :(得分:0)
我认为最简单的方法是使用默认的StringBuilder
。
此类具有很好的功能,可能有用。
它称为reverse()
。它按照它说的去做,它颠倒了被解析为StringBuilder
的String。有了它,只需检查给定的String是否等于倒数即可。
例如,您可以这样做:
public boolean isPallindrome(String input){
StringBuilder reversed = new StringBuilder(input);
reversed.reverse();
/*
* Just replace equals with equalsIgnoreCase
* to ignore the case
*/
return(reversed.toString().equalsIgnoreCase(input));
}
给定的代码仅创建一个StringBuilder
实例并直接附加输入。
然后,它反转StringBuilder
并检查输入是否等于反转的字符串。